(이것은 원래 @DaveE의 답변에 대한 주석 이었지만 시간이 오래 걸리기 때문에 자체 답변에 넣었습니다.)
TRUNCATE
인 기록 된 동작. 그렇지 않으면 ACID와 호환되지 않아야합니다. 그러나 차이 TRUNCATE
와 DELETE
:
- 로그 공간 사용량 :
TRUNCATE
해제 된 페이지 / 연장자 * 만 DELETE
기록하고 개별 행은 기록합니다.
- 잠금 사용법 : 행 잠금을 사용
TRUNCATE
하는 것과는 반대로 테이블 잠금 및 페이지 잠금을 사용하므로 일반적으로 잠금을 적게 DELETE
사용합니다. **.
IDENTITY
sequence : TRUNCATE
테이블에서 ID 시퀀스를 재설정합니다 (있는 경우).
(* 익스텐트 = 8 페이지. TRUNCATE
익스텐트가 모두 하나의 테이블에있는 경우 익스텐트를 기록 / 제거합니다. 그렇지 않으면 혼합 익스텐트에서 페이지를 기록 / 제거합니다.
** 이것의 한 가지 부작용 DELETE FROM TABLE
은 작업이 독점 테이블 잠금을 얻을 수 있는지 여부에 따라 테이블에 빈 페이지가 할당 될 수 있다는 것입니다.)
따라서 (원래 질문으로 돌아가서), 테이블을 비우고 있지만 구조를 유지하려는 경우 (NB : 다른 테이블의 외래 키로 참조되는 테이블에서는 사용할 수 없음) TRUNCATE TABLE
보다 결정적으로 좋습니다 .DELETE FROM TABLE
TRUNCATE
@Tullo의 의견에서 언급했듯이 데이터베이스의 복구 모델도 확인하십시오. 가득 차면 로그 백업을 시작하거나 복구 모델을 단순으로 변경해야합니다. 두 가지 중 하나를 수행하면 여유 공간을 모두 확보하기 위해 로그 파일을 일회용 작업 (NB : log file only ) 으로 축소 할 수 있습니다.
마지막으로 알아야 할 또 다른 사항은 테이블 통계입니다. 쿼리 최적화 프로그램이 이전 통계에 의해 트립되지 않도록 UPDATE STATISTICS <TABLENAME>' after
TRUNCATE /
DELETE`를 실행하십시오 .
TRUNCATE TABLE
대신을 사용 하는 것이 좋습니다DELETE FROM
.