次の方法で共有


DBCC CLEANTABLE (Transact-SQL)

テーブルまたはインデックス付きビュー内で削除された可変長列の領域を、クリーンして再利用可とします。

トピック リンク アイコン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
    1 つのトランザクションで処理する行の数を指定します。値を指定しない場合や 0 を指定した場合は、テーブル全体が 1 つのトランザクションで処理されます。

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

説明

DBCC CLEANTABLE は、可変長列の削除後に残る領域の返還を要求します。可変長列のデータ型は、varchar、nvarchar、varchar(max)、nvarchar(max)、varbinary、varbinary(max)、text、ntext、image、sql_variant、xml のいずれかになります。固定長列の削除後に残る領域の返還は要求しません。

削除された列が行内にあった場合、DBCC CLEANTABLE は、テーブルの IN_ROW_DATA アロケーション ユニットからの領域の返還を要求します。削除された列が行外にあった場合、その列のデータ型に応じて、ROW_OVERFLOW_DATA または LOB_DATA アロケーション ユニットからの領域の返還を要求します。ROW_OVERFLOW_DATA または LOB_DATA ページから領域が返還され空のページとなった場合、ページは削除されます。アロケーション ユニットおよびデータ型の詳細については、「テーブルとインデックスのデータ構造のアーキテクチャ」を参照してください。

DBCC CLEANTABLE は 1 つ以上のトランザクションとして実行されます。バッチ サイズを指定しない場合は、テーブル全体が 1 つのトランザクションで処理され、その間テーブルが排他ロックされます。テーブルの規模が大きくなると、シングル トランザクションが長すぎたり必要なログ領域が大きすぎたりする可能性があります。バッチ サイズを指定すると、コマンドは指定した数の行の一連のトランザクションで処理されるようになります。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 を使用して領域を再利用する

次の例では、AdventureWorks サンプル データベースの Production.Document テーブルに対して DBCC CLEANTABLE を実行します。

DBCC CLEANTABLE (AdventureWorks,"Production.Document", 0)
WITH NO_INFOMSGS;
GO

B. DBCC CLEANTABLE を使用し、その結果を確認する

次の例では、複数の可変長列を含むテーブルを作成し設定した後、2 つの列を削除して DBCC CLEANTABLE を実行し、未使用領域の返還を要求します。クエリを実行し、DBCC CLEANTABLE コマンドの実行前と実行後のページ数と領域の値を確認してください。

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.CleanTableTest', 'U') IS NOT NULL
    DROP TABLE dbo.CleanTableTest;
GO
CREATE TABLE dbo.CleanTableTest
    (DocumentID int Not Null,
    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 DocumentID,
           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'AdventureWorks');
SET @object_id = OBJECT_ID(N'AdventureWorks.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'AdventureWorks');
SET @object_id = OBJECT_ID(N'AdventureWorks.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 (AdventureWorks,"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'AdventureWorks');
SET @object_id = OBJECT_ID(N'AdventureWorks.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