共用方式為


DBCC CLEANTABLE (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure 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

每筆交易處理的資料列數量。 若未指定,則預設值為 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 可作為一或多筆交易執行。 如果未指定批次大小,則預設大小為 1000。 對於某些大型數據表,單一交易的長度和所需的記錄空間可能太多。 如果指定了批次大小,便會在一系列交易中執行這個命令,每項交易都包含指定數目的資料列。 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 並驗證結果

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