Share via


DBCC CLEANTABLE (Transact-SQL)

Recupera o espaço de colunas de comprimento variável descartadas em tabelas ou exibições indexadas.

Ícone de vínculo de tópicoConvenções de 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 especificado 0, 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. Para obter mais informações sobre unidades de alocação e tipos de dados, consulte Arquitetura de estruturas de dados de índice e tabela.

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 ou tabelas temporárias.

Práticas recomendadas

DBCC CLEANTABLE não deve ser executado como uma tarefa de manutenção rotineira. 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 AdventureWorks.

DBCC CLEANTABLE (AdventureWorks,"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 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