DBCC CLEANTABLE (Transact-SQL)
Recupera o espaço de colunas de comprimento variável descartadas em tabelas ou exibições indexadas.
Aplica-se a: SQL Server (SQL Server 2008 à versão atual). |
Convenções da sintaxe Transact-SQL
Sintaxe
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
Argumentos
database_name| database_id | 0
É o banco de dados ao qual pertence a tabela a ser limpa. Se 0 for especificado, será usado o banco de dados atual. Nomes de banco de dados devem seguir as regras para identificadores.table_name| table_id | view_name| view_id
É a tabela ou exibição indexada a ser limpa.batch_size
É o número de linhas processadas por transação. Caso não especificado, ou se especificado 0, a instrução processará a tabela inteira em uma transação.WITH NO_INFOMSGS
Suprime todas as mensagens informativas.
Comentários
DBCC CLEANTABLE recupera espaço depois que uma coluna de comprimento variável é descartada. Uma coluna de comprimento variável pode ser um dos seguintes tipos de dados: varchar, nvarchar, varchar(max), nvarchar(max), varbinary, varbinary(max), text, ntext, image, sql_variant e xml. O comando não recupera espaço depois que uma coluna de comprimento fixo é descartada.
Se as colunas descartadas forem armazenadas em linha, DBCC CLEANTABLE recuperará espaço da unidade de alocação IN_ROW_DATA da tabela. Se as colunas forem armazenadas fora de linha, o espaço será recuperado da unidade de alocação LOB_DATA ou ROW_OVERFLOW_DATA, dependendo do tipo de dados da coluna descartada. Se o espaço recuperado de uma página ROW_OVERFLOW_DATA ou LOB_DATA resultar em uma página vazia, DBCC CLEANTABLE removerá a página.
DBCC CLEANTABLE executa como uma ou mais transações. Se não for especificado um tamanho de lote, o comando processará a tabela inteira em uma transação e a tabela será bloqueada exclusivamente durante a operação. Para algumas tabelas grandes, o comprimento da única transação e o espaço do log requeridos podem ser muito grandes. Se um tamanho de lote for especificado, o comando executará em uma série de transações, cada qual incluindo o número especificado de linhas. DBCC CLEANTABLE não pode ser executado como uma transação dentro de outra transação.
Essa operação é totalmente registrada.
Não há suporte para DBCC CLEANTABLE para uso em tabelas do sistema, tabelas temporárias ou a parte do índice columnstore xVelocity de memória otimizada de uma tabela.
Práticas recomendadas
DBCC CLEANTABLE não deve ser executado como uma tarefa de manutenção de rotina. Em vez disso, use DBCC CLEANTABLE depois de fazer mudanças significativas em colunas de comprimento variável em uma tabela ou exibição indexada e precisar recuperar o espaço sem-uso prontamente. Como alternativa, é possível reconstruir os índices na tabela ou exibição; no entanto, essa é uma operação que utiliza muitos recursos.
Conjuntos de resultados
DBCC CLEANTABLE retorna:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Permissões
O chamador deve possuir a tabela ou exibição indexada ou ser um membro da função de servidor fixa sysadmin, da função de banco de dados fixa db_owner ou da função de banco de dados fixa db_ddladmin.
Exemplos
A.Usando DBCC CLEANTABLE para recuperar espaço
O exemplo a seguir executa DBCC CLEANTABLE para a tabela Production.Document no banco de dados de exemplo AdventureWorks2012 .
DBCC CLEANTABLE (AdventureWorks2012,'Production.Document', 0)
WITH NO_INFOMSGS;
GO
B.Usando DBCC CLEANTABLE e verificando resultados
O exemplo a seguir cria e popula uma tabela com várias colunas de comprimento variável. A seguir, duas das colunas são descartadas, e DBCC CLEANTABLE é executado para recuperar o espaço não utilizado. Uma consulta é executada para verificar os valores da contagem de página e espaço usado, antes e depois que o comando DBCC CLEANTABLE for executado.
USE AdventureWorks2012;
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'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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 (AdventureWorks2012,'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'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.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