DBCC CLEANTABLE (Transact-SQL)

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

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • database_name| database_id | 0
    Database a cui appartiene la tabella in cui recuperare lo spazio. Se si specifica 0, verrà utilizzato il database corrente. I nomi dei database devono essere conformi alle regole per gli identificatori.

  • table_name| table_id | view_name| view_id
    Tabella o vista indicizzata in cui recuperare lo spazio.

  • batch_size
    Numero di righe elaborate per transazione. Se si omette l'argomento o si specifica 0, l'istruzione elabora l'intera tabella in una sola transazione.

  • 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. Questo comando non consente di recuperare spazio dopo l'eliminazione di colonne a lunghezza fissa.

Se le colonne eliminate erano archiviate all'interno di righe, 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 l'operazione di recupero di spazio da una pagina ROW_OVERFLOW_DATA o LOB_DATA restituisce una pagina vuota, DBCC CLEANTABLE rimuove tale pagina. Per ulteriori informazioni sulle unità di allocazione e sui tipi di dati, vedere Architettura delle strutture di dati di indici e tabelle.

DBCC CLEANTABLE viene eseguita come una o più transazioni. Se non si specificano le dimensioni di batch, il comando elabora l'intera tabella in una sola transazione e per la tabella viene acquisito un blocco esclusivo durante l'operazione. 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. Non è possibile eseguire DBCC CLEANTABLE come una transazione all'interno di un'altra transazione.

Questa operazione viene registrata completamente.

Non è supportato l'utilizzo di DBCC CLEANTABLE per tabelle di sistema o tabelle temporanee.

Procedure consigliate

Non eseguire DBCC CLEANTABLE come attività di manutenzione di routine. Utilizzare invece DBCC CLEANTABLE dopo aver apportato modifiche significative alle colonne a lunghezza variabile di una tabella o di una vista indicizzata, se è necessario recuperare immediatamente lo spazio inutilizzato. In alternativa, è possibile ricostruire 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

A. Utilizzo di DBCC CLEANTABLE per il recupero di spazio

Nell'esempio seguente viene eseguito DBCC CLEANTABLE per la tabella Production.Document del database di esempio AdventureWorks.

DBCC CLEANTABLE (AdventureWorks,"Production.Document", 0)
WITH NO_INFOMSGS;
GO

B. Utilizzo di DBCC CLEANTABLE e verifica dei risultati

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

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