DBCC CLEANTABLE (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure 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 ]

Note

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

database_name | database_id | 0

クリーンするテーブルが含まれるデータベース。 0 を指定すると、現在のデータベースが選択されます。 データベース名は、識別子のルールに従っている必要があります。

table_name | table_id | view_name | view_id

クリーンするテーブルまたはインデックス付きビュー。

batch_size

1 つのトランザクションで処理する行の数。 指定しない場合は、既定値の 1000 が使用されます。 復旧期間が長くなるのを避けるため、0 は許可されません。

WITH NO_INFOMSGS

すべての情報メッセージを表示しないようにします。

解説

DBCC CLEANTABLE は、可変長列の削除後に残る領域の返還を要求します。 可変長列には、varcharnvarcharvarchar(max)nvarchar(max)varbinaryvarbinary(max)textntextimagesql_variantxml のいずれかのデータ型を使用できます。 固定長列の削除後に残る領域の返還は要求しません。

削除された列が行内にあった場合、DBCC CLEANTABLE は、テーブルの IN_ROW_DATA アロケーション ユニットからの領域の返還を要求します。 削除された列が行外にあった場合、その列のデータ型に応じて、ROW_OVERFLOW_DATA または LOB_DATA アロケーション ユニットからの領域の返還を要求します。 ROW_OVERFLOW_DATA または LOB_DATA ページから領域の返還を要求した結果ページが空になる場合、DBCC CLEANTABLE はページを削除します。

DBCC CLEANTABLE は 1 つ以上のトランザクションとして実行されます。 バッチ サイズを指定しない場合、既定のサイズは 1000 です。 テーブルの規模が大きくなると、シングル トランザクションが長すぎたり必要なログ領域が大きすぎたりする可能性があります。 バッチ サイズを指定すると、コマンドは指定した数の行の一連のトランザクションで処理されるようになります。 DBCC CLEANTABLE は、他のトランザクション内のトランザクションとして実行することはできません。

この操作はすべてログに記録されます。

DBCC CLEANTABLE は、システム テーブル、一時テーブル、またはテーブルのメモリ最適化列ストア インデックスの部分での使用はサポートされません。

ベスト プラクティス

DBCC CLEANTABLE を定期的なメンテナンス タスクとして実行することはできません。 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 を使用して結果を確認する

次の例では、複数の可変長列を含むテーブルを作成し設定した後、 2 つの列を削除して 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

関連項目