DBCC CLEANTABLE (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Освобождает место на диске, занятое удаленными из таблиц столбцами переменной длины или индексированными представлениями.
Соглашения о синтаксисе 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
не поддерживается для использования в системных таблицах, временных таблицах или в части индекса columnstore, оптимизированной для памяти.
Рекомендации
DBCC CLEANTABLE
не следует выполнять как обычную задачу обслуживания. Вместо этого используйте DBCC CLEANTABLE
после внесения значительных изменений в столбцы переменной длины в таблице или индексируемом представлении, и вам необходимо немедленно вернуть неиспользуемое пространство. Кроме того, можно выполнить перестроение индексов таблицы или представления, однако это более ресурсоемкая операция.
Результирующий набор
DBCC CLEANTABLE
возвращает:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Разрешения
Участник должен быть владельцем таблицы или индексированного представления либо членом предопределенной роли сервера sysadmin, предопределенной роли базы данных db_owner или предопределенной роли базы данных db_ddladmin.
Примеры
А. Использование DBCC CLEANTABLE для освобождения пространства
Следующий пример выполняется DBCC CLEANTABLE
для Production.Document
таблицы в AdventureWorks2022
примере базы данных.
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