Partilhar via


DBCC CLEANTABLE (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

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

Convenções de sintaxe de 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 a tabela a ser limpa pertence. Se 0 for especificado, será usado o banco de dados atual. Os nomes de banco de dados precisam 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. Se esse campo não for especificado, o valor padrão será 1000.

Um valor de não é suportado e não é recomendado, para evitar um longo período de 0 recuperação.

WITH NO_INFOMSGS

Suprime todas as mensagens informativas.

Comentários

DBCC CLEANTABLE recupera o espaço depois que uma coluna de comprimento variável é removida. Uma coluna de comprimento variável pode ser de 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 o espaço depois que uma coluna de comprimento fixo é removida.

Se as colunas removidas forem armazenadas em linha, DBCC CLEANTABLE recuperará o 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 é executado como uma ou mais transações. Se um tamanho de lote não for especificado, o tamanho padrão será 1000. Para algumas tabelas grandes, o comprimento da transação única e o espaço de log necessário podem ser demais. 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.

Essa operação é totalmente registrada.

Não há suporte para o uso de DBCC CLEANTABLE em tabelas do sistema, tabelas temporárias ou na parte do índice columnstore 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 quando precisar recuperar o espaço inutilizado prontamente. Como alternativa, é possível reconstruir os índices na tabela ou exibição; no entanto, essa é uma operação que utiliza muitos recursos.

Conjunto de resultados

O DBCC CLEANTABLE retorna:

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Permissões

O chamador precisa ter a tabela ou a exibição indexada ou ser 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. Usar DBCC CLEANTABLE para recuperar espaço

O exemplo a seguir executa DBCC CLEANTABLE para a tabela Production.Document no banco de dados de exemplo AdventureWorks2022.

DBCC CLEANTABLE (AdventureWorks2022, 'Production.Document', 1000)
WITH NO_INFOMSGS;
GO

B. Usar DBCC CLEANTABLE e verificar os resultados

O exemplo a seguir cria e popula uma tabela com várias colunas de comprimento variável. Duas das colunas são removidas e DBCC CLEANTABLE é executado para recuperar o espaço não utilizado. Uma consulta é executada para verificar os valores de contagem de página e espaço usado, antes e depois que o comando DBCC CLEANTABLE é executado.

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