Share via


TRUNCATE TABLE을 사용하여 모든 행 삭제

TRUNCATE TABLE 문은 속도가 빠르며 테이블에서 모든 행을 삭제하는 효율적인 방법입니다. TRUNCATE TABLE은 WHERE 절 없는 DELETE 문과 유사합니다. 그러나 TRUNCATE TABLE이 더 빠르고 시스템 및 트랜잭션 로그 리소스를 덜 사용합니다.

DELETE 문과 비교하여 TRUNCATE TABLE에는 다음과 같은 이점이 있습니다.

  • 트랜잭션 로그 공간이 덜 사용됩니다.

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

  • 일반적으로 적은 수의 잠금이 사용됩니다.

    행 잠금을 사용하여 DELETE 문을 실행하면 삭제를 위해 테이블의 각 행이 잠깁니다. TRUNCATE TABLE은 항상 테이블과 페이지를 잠그지만 각 행은 잠그지 않습니다.

  • 빈 페이지는 예외 없이 테이블에 남습니다.

    DELETE 문이 실행된 다음 테이블은 계속 빈 페이지를 포함할 수 있습니다. 예를 들어 배타(LCK_M_X) 테이블 잠금이 하나 이상 있어야만 힙의 빈 페이지를 할당 취소할 수 있습니다. 삭제 작업에서 테이블 잠금을 사용하지 않는 경우 테이블(힙)에는 빈 페이지가 많이 포함됩니다. 인덱스의 경우 삭제 작업 후에 빈 페이지가 남을 수 있지만 이러한 페이지는 백그라운드 정리 프로세스에 의해 할당이 신속하게 취소됩니다.

DELETE와 마찬가지로 TRUNCATE TABLE 문을 사용하여 비워진 테이블 정의는 인덱스 및 기타 관련 개체와 함께 데이터베이스에 유지됩니다. 테이블에 ID 열이 포함되어 있으면 해당 열의 카운터는 열에 대해 정의된 초기값으로 다시 설정됩니다. 초기값이 정의되어 있지 않으면 기본값인 1이 사용됩니다. ID 카운터를 보존하려면 DELETE를 대신 사용하십시오.

대형 테이블 잘라내기

MicrosoftMicrosoftSQL Server에는 삭제할 모든 익스텐트에 대한 동시 잠금이 없는 한 128개를 초과하는 익스텐트를 갖고 있는 테이블을 삭제하거나 잘라내는 기능이 추가되었습니다. 자세한 내용은 큰 개체 삭제 및 다시 작성을 참조하십시오.

다음 예에서는 JobCandidate 테이블에서 모든 데이터를 제거합니다. SELECT 문이 TRUNCATE TABLE 문 앞과 뒤에 포함되어 결과를 비교합니다.

USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO