DELETE 문을 사용하여 테이블의 데이터를 삭제한 후 테이블이 사용하는 공간이 완전히 해제되지는 SQL Server

이 문서는 DELETE 문을 사용하여 테이블에서 모든 데이터를 삭제한 후 테이블에서 사용하는 문제를 해제할 수 없는 문제를 해결하는 데 도움이 됩니다.

원래 제품 버전: SQL Server
원래 KB 번호: 913399

증상

Microsoft SQL Server DELETE 문을 사용하여 테이블에서 데이터를 삭제한 후에는 테이블에서 사용하는 공간이 완전히 해제되지 않은 것을 알 수 있습니다. 그런 다음 데이터베이스에 데이터를 삽입하려고 하면 다음 오류 메시지가 표시될 수 있습니다.

'PRIMARY' 파일 그룹이 가득 찼기 때문에 데이터베이스 'DatabaseName'의 개체 'TableName'에 대한 공간을 할당할 수 없습니다.

참고

TableName 은 테이블의 이름을 나타냅니다. DatabaseName 은 테이블을 포함하는 데이터베이스의 이름을 나타냅니다.

원인

이 문제는 SQL Server 다음 조건이 충족될 때 힙 테이블에서 사용하는 모든 페이지만 해제하기 때문에 발생합니다.

  • 이 테이블의 삭제가 발생합니다.
  • 테이블 수준 잠금이 유지되고 있습니다.

참고

힙 테이블은 클러스터형 인덱스와 연결되지 않은 테이블입니다.

페이지를 할당 취소하지 않으면 데이터베이스의 다른 개체에서 페이지를 다시 사용할 수 없습니다.

그러나 SQL Server 데이터베이스에서 행 versioning-based 격리 수준을 사용하도록 설정하면 테이블 수준 잠금이 유지되더라도 페이지를 해제할 수 없습니다. 행 versioning-based 격리 수준에 대한 자세한 내용은 SQL Server 데이터베이스 엔진의 격리 수준을 참조하세요.

해결 방법

이 문제를 해결하려면 다음 방법 중 하나를 사용합니다.

  • 행 버전 관리 기반 격리 수준을 사용하도록 설정하지 않은 경우 DELETE 문에 TABLOCK 힌트를 포함합니다. 예를 들어 다음과 유사한 문을 사용합니다.

    DELETE FROM <TableName> WITH (TABLOCK)
    

    참고

    <TableName> 은 테이블의 이름을 나타냅니다.

  • 테이블의 모든 레코드를 삭제하려면 TRUNCATE TABLE 문을 사용합니다. 예를 들어 다음과 유사한 문을 사용합니다.

    TRUNCATE TABLE <TableName>
    
  • 테이블의 열에 클러스터형 인덱스 만들기 테이블에서 클러스터형 인덱스를 만드는 방법에 대한 자세한 내용은 클러스터형 인덱스 만들기를 참조하세요.