다음을 통해 공유


DBCC CLEANTABLE(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

테이블 또는 인덱싱된 뷰의 삭제된 가변 길이 열에서 공간을 반환합니다.

Transact-SQL 구문 표기 규칙

구문

DBCC CLEANTABLE
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , batch_size ]
)
[ WITH NO_INFOMSGS ]

인수

database_name | database_id | 0

정리될 테이블이 속한 데이터베이스입니다. 0을 지정하면 현재 데이터베이스가 사용됩니다. 데이터베이스 이름은 반드시 식별자에 적용되는 규칙을 준수해야 합니다.

table_name | table_id | view_name | view_id

정리될 테이블이나 인덱싱된 뷰입니다.

batch_size

트랜잭션당 처리되는 행 수입니다. 지정하지 않으면 기본값 1000입니다.

긴 복구 기간을 방지하기 위해 값 0 은 지원되지 않으며 권장되지 않습니다.

WITH NO_INFOMSGS

모든 정보 메시지를 표시하지 않습니다.

설명

DBCC CLEANTABLE은 가변 길이 열이 삭제된 후에 공간을 반환합니다. 가변 길이 열은 varchar, nvarchar, varchar(max) , nvarchar(max) , varbinary, varbinary(max) , text, ntext, image, sql_variantxml 데이터 형식 중 하나일 수 있습니다. 이 명령은 고정 길이 열이 삭제된 후에는 공간을 반환하지 않습니다.

삭제된 열이 행 내부에 저장된 경우 DBCC CLEANTABLE은 테이블의 IN_ROW_DATA 할당 단위에서 공간을 반환합니다. 열이 행 외부에 저장된 경우에는 삭제된 열의 데이터 형식에 따라 ROW_OVERFLOW_DATA 또는 LOB_DATA 할당 단위에서 공간이 반환됩니다. ROW_OVERFLOW_DATA 또는 LOB_DATA 페이지에서 공간을 반환하면 빈 페이지가 되고 DBCC CLEANTABLE이 해당 페이지를 제거합니다.

DBCC CLEANTABLE은 하나 이상의 트랜잭션으로 실행됩니다. 일괄 처리 크기를 지정하지 않으면 기본 크기는 .입니다 1000. 일부 큰 테이블의 경우 단일 트랜잭션의 길이와 필요한 로그 공간이 너무 많을 수 있습니다. 일괄 처리 크기를 지정하면 이 명령은 각기 지정한 행 수를 포함한 일련의 트랜잭션으로 실행됩니다. 다른 트랜잭션 내의 트랜잭션으로 DBCC CLEANTABLE을 실행할 수는 없습니다.

이 작업은 모두 기록됩니다.

DBCC CLEANTABLE은 시스템 테이블, 임시 테이블 또는 테이블의 메모리 최적화 columnstore 인덱스 부분에 대해서는 사용할 수 없습니다.

모범 사례

일상적인 유지 관리 태스크로 DBCC CLEANTABLE을 실행하지 않도록 합니다. 대신 테이블 또는 인덱싱된 뷰의 가변 길이 열을 상당 부분 변경한 후에 DBCC CLEANTABLE을 사용하며 사용하지 않은 공간을 즉시 반환해야 합니다. 또는 테이블이나 뷰에 인덱스를 다시 작성할 수 있습니다. 그러나 이렇게 하려면 더 많은 리소스가 필요합니다.

결과 집합

DBCC CLEANTABLE은 다음을 반환합니다.

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

사용 권한

호출자는 테이블 또는 인덱싱된 뷰를 소유하거나, sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 멤버여야 합니다.

A. DBCC CLEANTABLE을 사용하여 공간 반환

다음 예에서는 AdventureWorks2022 샘플 데이터베이스의 Production.Document 테이블에 대해 DBCC CLEANTABLE을 실행합니다.

DBCC CLEANTABLE (AdventureWorks2022, 'Production.Document', 1000)
WITH NO_INFOMSGS;
GO

B. DBCC CLEANTABLE 사용 및 결과 확인

다음 예에서는 테이블을 만들고 여러 개의 가변 길이 열을 채웁니다. 그런 다음, 이 중에서 두 개의 열을 삭제하고 DBCC CLEANTABLE을 실행하여 사용하지 않은 공간을 반환합니다. 쿼리를 실행하여 DBCC CLEANTABLE 명령을 실행하기 전후의 페이지 수 및 사용된 공간 값을 확인합니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.CleanTableTest', 'U') IS NOT NULL
    DROP TABLE dbo.CleanTableTest;
GO

CREATE TABLE dbo.CleanTableTest (
    FileName NVARCHAR(4000),
    DocumentSummary NVARCHAR(MAX),
    Document VARBINARY(MAX)
);
GO

-- Populate the table with data from the Production.Document table.
INSERT INTO dbo.CleanTableTest
SELECT REPLICATE(FileName, 1000),
    DocumentSummary,
    Document
FROM Production.Document;
GO

-- Verify the current page counts and average space used in the dbo.CleanTableTest table.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.dbo.CleanTableTest');

SELECT alloc_unit_type_desc,
    page_count,
    avg_page_space_used_in_percent,
    record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL, 'Detailed');
GO

-- Drop two variable-length columns from the table.
ALTER TABLE dbo.CleanTableTest
DROP COLUMN FileName, Document;
GO

-- Verify the page counts and average space used in the dbo.CleanTableTest table
-- Notice that the values have not changed.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.dbo.CleanTableTest');

SELECT alloc_unit_type_desc,
    page_count,
    avg_page_space_used_in_percent,
    record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL, 'Detailed');
GO

-- Run DBCC CLEANTABLE.
DBCC CLEANTABLE (AdventureWorks2022, 'dbo.CleanTableTest');
GO

-- Verify the values in the dbo.CleanTableTest table after the DBCC CLEANTABLE command.
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.dbo.CleanTableTest');

SELECT alloc_unit_type_desc,
    page_count,
    avg_page_space_used_in_percent,
    record_count
FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL, 'Detailed');
GO