DBCC CLEANTABLE (Transact-SQL)
Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance
Gibt Speicherplatz wieder frei, der von gelöschten Spalten mit variabler Länge in Tabellen oder indizierten Sichten belegt wurde.
Transact-SQL-Syntaxkonventionen
Syntax
DBCC CLEANTABLE
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , batch_size ]
)
[ WITH NO_INFOMSGS ]
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.
Argumente
database_name | database_id | 0
Die Datenbank, zu der die Tabelle gehört, für die ein Cleanup ausgeführt werden soll. Wird 0 angegeben, wird die aktuelle Datenbank verwendet. Datenbanknamen müssen den Regeln für Bezeichner entsprechen.
table_name | table_id | view_name | view_id
Die Tabelle oder indizierte Sicht, für die ein Cleanup ausgeführt werden soll
batch_size
Die Anzahl von Zeilen, die pro Transaktion verarbeitet werden sollen. Wenn Sie hier nichts angeben, lautet der Standardwert 1000
. Um einen langen Wiederherstellungszeitraum zu vermeiden, ist 0
nicht zulässig.
WITH NO_INFOMSGS
Alle Informationsmeldungen werden unterdrückt.
Bemerkungen
DBCC CLEANTABLE
gibt Speicherplatz wieder frei, nachdem eine Spalte mit variabler Länge gelöscht wurde. Eine Spalte mit variabler Länge kann einem der folgenden Datentypen entsprechen: varchar, nvarchar, varchar(max) , nvarchar(max) , varbinary, varbinary(max) , text, ntext, image, sql_variant und xml. Nach dem Löschen einer Spalte mit fester Länge wird jedoch kein Speicherplatz geschaffen.
Falls die gelöschten Spalten innerhalb von Zeilen gespeichert waren, gibt DBCC CLEANTABLE
Speicherplatz aus der IN_ROW_DATA-Zuordnungseinheit der Tabelle frei. Waren die Spalten außerhalb von Zeilen gespeichert, wird Speicherplatz je nach dem Datentyp der gelöschten Spalte aus einer der Zuordnungseinheiten ROW_OVERFLOW_DATA oder LOB_DATA freigegeben. Falls durch das Freigeben von Speicherplatz aus einer ROW_OVERFLOW_DATA- oder LOB_DATA-Seite eine leere Seite entsteht, wird diese durch DBCC CLEANTABLE
entfernt.
DBCC CLEANTABLE
wird als eine oder mehrere Transaktionen ausgeführt. Wenn keine Batchgröße angegeben wird, ist 1000
die Standardgröße. Für einige große Tabellen sind eine einzige Transaktion und der erforderliche Protokollspeicherplatz möglicherweise zu groß. Wenn eine Batchgröße angegeben wurde, wird der Befehl in einer Reihe von Transaktionen ausgeführt, wobei jede die angegebene Zeilenanzahl einschließt. DBCC CLEANTABLE
kann nicht als eine Transaktion innerhalb einer anderen Transaktion ausgeführt werden.
Diese Operation wird vollständig protokolliert.
DBCC CLEANTABLE
wird nicht für die Verwendung in Systemtabellen, temporären Tabellen oder im speicheroptimierten Columnstore-Indexbereich einer Tabelle unterstützt.
Bewährte Methoden
DBCC CLEANTABLE
sollte nicht als routinemäßiger Wartungstask ausgeführt werden. Verwenden Sie DBCC CLEANTABLE
, wenn Sie wesentliche Änderungen an Spalten mit variabler Länge in einer Tabelle oder indizierten Sicht vorgenommen haben und den nicht verwendeten Speicherplatz sofort freigeben müssen. Alternativ können Sie auch die Indizes für die Tabelle oder Sicht neu erstellen. Dies ist jedoch ein ressourcenintensiverer Vorgang.
Resultsets
DBCC CLEANTABLE
gibt Folgendes zurück:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Berechtigungen
Bei dem Aufrufer muss es sich um den Besitzer der Tabelle bzw. der indizierten Sicht oder um ein Mitglied der festen Serverrolle sysadmin, der festen Datenbankrolle db_owner oder der festen Datenbankrolle db_ddladmin handeln.
Beispiele
A. Freigeben von Speicherplatz mit DBCC CLEANTABLE
Im folgenden Beispiel wird DBCC CLEANTABLE
für die Production.Document
-Tabelle in der AdventureWorks2022
-Beispieldatenbank ausgeführt.
DBCC CLEANTABLE (AdventureWorks2022, 'Production.Document', 1000)
WITH NO_INFOMSGS;
GO
B. Verwenden von DBCC CLEANTABLE und Überprüfen von Ergebnissen
Im folgenden Beispiel wird eine Tabelle mit mehreren Spalten variabler Länge erstellt und aufgefüllt. Anschließend werden zwei Spalten gelöscht, und DBCC CLEANTABLE
wird ausgeführt, um den nicht verwendeten Speicherplatz freizugeben. Es wird eine Abfrage ausgeführt, um die Werte für die Seitenanzahl und den verwendeten Speicherplatz vor und nach der Ausführung des DBCC CLEANTABLE
-Befehls zu überprüfen.
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