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
    這是每項交易所處理的資料列數。若未指定,或指定 0,陳述式就會在單一交易中處理整份資料表。

  • 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 會將頁面移除。如需有關配置單位和資料類型的詳細資訊,請參閱<資料表和索引資料結構架構>。

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 回收空間

下列範例會針對 AdventureWorks 範例資料庫中的 Production.Document 資料表執行 DBCC CLEANTABLE。

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

B. 使用 DBCC CLEANTABLE 並確認結果

下列範例會建立並擴展具有數個可變長度資料行的資料表。接著將卸除兩個資料行,然後執行 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