Condividi tramite


DBCC CLEANTABLE (Transact-SQL)

Si applica a: SQL Server Azure SQL DatabaseIstanza gestita di SQL di Azure

Recupera lo spazio delle colonne a lunghezza variabile eliminate nelle tabelle e nelle viste indicizzate.

Convenzioni di sintassi Transact-SQL

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

database_name | database_id | 0

Database in cui appartiene la tabella da pulire. Se si specifica 0, viene utilizzato il database corrente. I nomi di database devono essere conformi alle regole per gli identificatori.

table_name | table_id | view_name | view_id

Tabella o visualizzazione indicizzata da pulire.

batch_size

Numero di righe elaborate per transazione. Se non è specificato, il valore predefinito è 1000. Per evitare un periodo di ripristino lungo, 0 non è consentito.

WITH NO_INFOMSGS

Disattiva tutti i messaggi informativi.

Osservazioni

DBCC CLEANTABLE recupera lo spazio dopo l'eliminazione di una colonna a lunghezza variabile. I possibili tipi di dati per una colonna a lunghezza variabile sono i seguenti: varchar, nvarchar, varchar(max) , nvarchar(max) , varbinary, varbinary(max) , text, ntext, image, sql_variant e xml. Il comando non recupera spazio dopo l'eliminazione di una colonna a lunghezza fissa.

Se le colonne eliminate sono state archiviate in riga, DBCC CLEANTABLE recupera lo spazio dall'unità di allocazione IN_ROW_DATA della tabella. Se le colonne erano archiviate all'esterno di righe, lo spazio viene recuperato dall'unità di allocazione ROW_OVERFLOW_DATA o LOB_DATA a seconda del tipo di dati della colonna eliminata. Se si recupera lo spazio da un ROW_OVERFLOW_DATA o da una pagina LOB_DATA viene generata una pagina vuota, DBCC CLEANTABLE rimuove la pagina.

DBCC CLEANTABLE viene eseguito come una o più transazioni. Se non viene specificata una dimensione batch, la dimensione predefinita è 1000. Per tabelle di grandi dimensioni, la lunghezza della singola transazione e lo spazio del log necessario potrebbero risultare eccessivi. Se si specificano le dimensioni del batch, il comando viene eseguito in una serie di transazioni, ognuna con il numero di righe specificato. DBCC CLEANTABLE non può essere eseguito come transazione all'interno di un'altra transazione.

Questa operazione viene registrata completamente.

DBCC CLEANTABLE non è supportato per l'uso nelle tabelle di sistema, nelle tabelle temporanee o nella parte dell'indice columnstore ottimizzato per la memoria di una tabella.

Procedure consigliate

DBCC CLEANTABLE non deve essere eseguito come attività di manutenzione di routine. Usare invece DBCC CLEANTABLE dopo aver apportato modifiche significative alle colonne a lunghezza variabile in una tabella o in una vista indicizzata e è necessario recuperare immediatamente lo spazio inutilizzato. In alternativa, è possibile ricompilare gli indici sulla tabella o sulla vista. Questa operazione richiede tuttavia molte risorse.

Set di risultati

DBCC CLEANTABLE Restituisce:

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

Autorizzazioni

Il chiamante deve essere il proprietario della tabella o della vista indicizzata oppure un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_owner o db_ddladmin.

Esempi

R. Usare DBCC CLEANTABLE per recuperare spazio

Nell'esempio seguente viene eseguita DBCC CLEANTABLE la Production.Document tabella nel AdventureWorks2022 database di esempio.

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

B. Usare DBCC CLEANTABLE e verificare i risultati

Nell'esempio seguente viene creata e popolata una tabella con più colonne a lunghezza variabile. Due delle colonne vengono quindi eliminate e DBCC CLEANTABLE vengono eseguite per recuperare lo spazio inutilizzato. Viene eseguita una query per verificare i conteggi delle pagine e lo spazio usati prima e dopo l'esecuzione del DBCC CLEANTABLE comando.

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

Vedi anche