it-swarm-ko.tech

큰 테이블에서 모든 데이터를 삭제하는 가장 빠른 방법

약 5 백만 개의 행이 포함 된 로그 테이블에서 모든 행을 삭제해야했습니다. 내 초기 시도는 쿼리 분석기에서 다음 명령을 실행하는 것입니다.

client_log에서 삭제

시간이 오래 걸렸습니다.

44
Ron Skufca

체크 아웃 테이블 잘림 훨씬 빠릅니다.

76
Rob Walker

Msdn transact-SQL 참조에서 TRUNCATE TABLE을 발견했습니다. 여기에 관심있는 모든 사람들이 있습니다 :

TRUNCATE TABLE은 WHERE 절이없는 DELETE 문과 기능적으로 동일합니다. 둘 다 테이블의 모든 행을 제거합니다. 그러나 TRUNCATE TABLE은 DELETE보다 빠르며 더 적은 시스템 및 트랜잭션 로그 리소스를 사용합니다.

DELETE 문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다. TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용 된 데이터 페이지를 할당 해제하여 데이터를 제거하며 페이지 할당 해제 만 트랜잭션 로그에 기록됩니다.

TRUNCATE TABLE은 테이블에서 모든 행을 제거하지만 테이블 구조와 해당 열, 제약 조건, 인덱스 등은 그대로 유지됩니다. 새 행에 대한 ID가 사용하는 카운터는 열의 시드로 재설정됩니다. ID 카운터를 유지하려면 대신 DELETE를 사용하십시오. 테이블 정의 및 해당 데이터를 제거하려면 DROP TABLE 문을 사용하십시오.

FOREIGN KEY 제약 조건에서 참조하는 테이블에는 TRUNCATE TABLE을 사용할 수 없습니다. 대신 WHERE 절없이 DELETE 문을 사용하십시오. TRUNCATE TABLE이 기록되지 않으므로 트리거를 활성화 할 수 없습니다.

인덱싱 된 뷰에 참여하는 테이블에는 TRUNCATE TABLE을 사용할 수 없습니다.

33
Ron Skufca

TRUNCATE가 어떻게 든 트랜잭션 로그를 건너 뛰는 일반적인 통념이 있습니다.

이것은 오해이며 MSDN에서 명확하게 언급됩니다.

이 신화는 여기에 여러 의견으로 제기됩니다. 함께 근절하자;)

15
squadette

참고로 TRUNCATE TABLE 은 MySQL에서도 작동합니다.

6
UnkwnTech

자르고 삭제하는 것을 잊지 마십시오. 테이블 정의를 유지 보수하고 (재 작성하려는 경우) 테이블 삭제 만 사용하십시오.

3
siculars

다음 방법을 사용하여 테이블을 제로화하고 테이블의 아카이브 사본을 남겨 두는 추가 보너스가 있습니다.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3
dar7yl

SQL Server에서는 Truncate Table 명령은 일반 삭제보다 빠르며 더 적은 리소스를 사용합니다. 또한 ID 필드를 시드 값으로 다시 설정합니다.

자르기의 단점은 외래 키로 참조되는 테이블에서 사용할 수 없으며 트리거를 발생시키지 않는다는 것입니다. 또한 문제가 발생하면 데이터를 롤백 할 수 없습니다.

1
Martynnw

truncate tablenot SQL 플랫폼과 무관합니다. might 데이터베이스 공급자가 변경 될 것으로 의심되는 경우이를 사용하는 것에주의해야합니다.

1
James A. Rosen

자동 증분 키를 사용하는 경우 TRUNCATE도 자동 증분 키를 재설정합니다.

자동 증분 키를 잃지 않으려면 세트를 삭제하여 삭제 속도를 높일 수 있습니다 (예 : DELETE FROM 테이블 WHERE id> 1 AND id <10000). 속도가 크게 향상되고 경우에 따라 데이터가 잠기지 않을 수도 있습니다.

1
Brian D.

"테이블 삭제 및 재생성"이라는 제안은 외래 키를 손상 시키므로 바람직하지 않습니다.

외래 키를 사용하고 있습니까?

0
Andy Lester

예, 5 백만 행을 삭제하는 데 시간이 오래 걸릴 수 있습니다. 내가 생각할 수있는 유일한 빠른 방법은 테이블을 삭제하고 다시 만드는 것입니다. 물론 테이블의 모든 데이터를 삭제하려는 경우에만 작동합니다.

0
TheSmurf

잘라 내기 테이블 client_log

가장 좋은 방법은 자르는 것이 테이블의 모든 내용과 색인을 죽이고 얻은 씨앗을 재설정하는 것입니다.

0
Ronald Hobbs

나는 나의 이전 진술을 개정하고있다 :

TRUNCATE를 사용하면 데이터가 지워지지 만 트랜잭션 로그에는 아무것도 기록되지 않습니다. 로그에 쓰면 DELETE가 5 백만 행을 영원히 차지하게됩니다. 개발 중에 TRUNCATE를 자주 사용하지만 변경 사항을 롤백 할 수 없으므로 프로덕션 데이터베이스에서 TRUNCATE를 사용하는 것에주의해야합니다. TRUNCATE를 수행 한 후 즉시 새로운 데이터베이스 복원을 수행하기 위해 전체 데이터베이스 백업을 작성해야합니다.

위의 진술은 둘 사이에 차이가 있음을 이해하도록 프롬프트하기위한 것입니다. 불행히도, 실제로 작성되지 않았으며 실제로 두 가지 테스트를하지 않았으므로 지원되지 않는 진술을합니다. 그것은 내가 다른 사람들로부터 들었던 진술에 근거합니다.

MSDN 에서 :

DELETE 문은 한 번에 하나씩 행을 제거하고 삭제 된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다. TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용 된 데이터 페이지를 할당 해제하여 데이터를 제거하며 페이지 할당 해제 만 트랜잭션 로그에 기록됩니다.

방금 둘 사이에 근본적인 차이가 있고 차이가 있기 때문에 둘 중 하나가 부적절 할 수있는 응용 프로그램이있을 것이라고 말하고 싶었습니다.

0
Andy Frieders

외래 키 및/또는 트리거로 인해 TRUNCATE TABLE을 사용할 수없는 경우 다음을 고려할 수 있습니다.

  • 모든 인덱스를 삭제하십시오.
  • 평소 DELETE를 수행하십시오.
  • 모든 색인을 다시 작성하십시오.

삭제 속도가 다소 빨라질 수 있습니다.

0
squadette