DBCC CLEANTABLE (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