Partilhar via


DBCC CLEANTABLE (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

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

Transact-SQL convenções de sintaxe

Sintaxe

DBCC CLEANTABLE
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , batch_size ]
)
[ WITH NO_INFOMSGS ]

Argumentos

| database_namedatabase_id | 0

O banco de dados ao qual pertence a tabela a ser limpa. Se 0 for especificado, o banco de dados atual será usado. Os nomes dos bancos de dados devem seguir as regras para identificadores.

table_name | table_id | view_name | view_id

A tabela ou vista indexada a ser limpa.

batch_size

O número de linhas processadas por transação. Se não for especificado, o valor padrão será 1000.

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

COM 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_variante xml. O comando não recupera espaço depois que uma coluna de comprimento fixo é descartada.

Se as colunas soltas foram armazenadas em linha, DBCC CLEANTABLE recupera espaço da unidade de alocação de IN_ROW_DATA da tabela. Se as colunas foram armazenadas fora da linha, o espaço é recuperado da unidade de alocação ROW_OVERFLOW_DATA ou LOB_DATA, dependendo do tipo de dados da coluna descartada. Se a recuperação de espaço 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 será executado em uma série de transações, cada uma incluindo o número especificado de linhas. DBCC CLEANTABLE não pode ser executado como uma transação dentro de outra transação.

Esta operação é totalmente registrada.

DBCC CLEANTABLE não é suportado para uso em tabelas do sistema, tabelas temporárias ou na parte de índice columnstore otimizada para memória de uma tabela.

Melhores práticas

DBCC CLEANTABLE não deve ser executada como uma tarefa de manutenção de rotina. Em vez disso, use DBCC CLEANTABLE depois de fazer alterações significativas em colunas de comprimento variável em uma tabela ou exibição indexada e você precisa recuperar imediatamente o espaço não utilizado. Como alternativa, você pode reconstruir os índices na tabela ou exibição; no entanto, fazê-lo é uma operação que consome mais recursos.

Conjunto de resultados

DBCC CLEANTABLE devoluções:

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

Permissões

O chamador deve ser proprietário da tabela ou da 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

Um. Use DBCC CLEANTABLE para recuperar espaço

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

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

B. Use DBCC CLEANTABLE e verifique os resultados

O exemplo a seguir cria e preenche uma tabela com várias colunas de comprimento variável. Duas das colunas são então descartadas e DBCC CLEANTABLE é executada para recuperar o espaço não utilizado. Uma consulta é executada para verificar as contagens de páginas e os valores de espaço usados 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