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 用于在删除可变长度列之后回收空间。 可变长度列可以是以下其中一种数据类型: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 作为一个或多个事务运行。 如果未指定批大小,则默认大小为 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