Partager via


DBCC CLEANTABLE (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

Récupère l'espace des colonnes de longueur variable supprimées dans les tables ou les vues indexées.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Arguments

database_name | database_id | 0

Base de données à laquelle la table à nettoyer appartient. Si 0 est spécifié, la base de données active est utilisée. Les noms de base de données doivent suivre les règles applicables aux identificateurs.

table_name | table_id | view_name | view_id

Table ou vue indexée à nettoyer.

batch_size

Nombre de lignes traitées par transaction. Si elle n’est pas spécifiée, la valeur par défaut est 1000.

Une valeur de 0 n’est pas prise en charge et n’est pas recommandée pour éviter une longue période de récupération.

WITH NO_INFOMSGS

Supprime tous les messages d'information.

Notes

DBCC CLEANTABLE récupère l’espace après suppression d’une colonne de longueur variable. Une colonne de longueur variable peut être l’un des types de données suivants : varchar, nvarchar, varchar(max) , nvarchar(max) , varbinary, varbinary(max) , text, ntext, image, sql_variant et xml. La commande ne récupère pas l’espace résultant de la suppression d’une colonne de longueur fixe.

Si les colonnes supprimées étaient stockées en ligne, DBCC CLEANTABLE récupère l’espace de l’unité d’allocation IN_ROW_DATA de la table. Si les colonnes étaient stockées hors ligne, l'espace est récupéré à partir de l'unité d'allocation ROW_OVERFLOW_DATA ou LOB_DATA, suivant le type de données de la colonne supprimée. Si la récupération de l’espace d’une page ROW_OVERFLOW_DATA ou LOB_DATA aboutit à une page vide, DBCC CLEANTABLE supprime la page.

DBCC CLEANTABLE s’exécute en tant qu’une ou plusieurs transactions. Si une taille de lot n’est pas spécifiée, la taille par défaut est 1000. Pour certaines tables volumineuses, la longueur de la transaction unique et l’espace journal requis peuvent être trop importants. Si une taille de traitement est spécifiée, la commande s'exécute dans une série de transactions, dont chacune inclut le nombre de lignes spécifié. DBCC CLEANTABLE ne peut pas être exécuté en tant que transaction à l’intérieur d’une autre transaction.

Cette opération est entièrement journalisée.

DBCC CLEANTABLE n’est pas pris en charge pour une utilisation sur les tables système, les tables temporaires ou la partie de l’index columnstore à mémoire optimisée d’une table.

Bonnes pratiques

DBCC CLEANTABLE ne doit pas être exécuté en tant que tâche de maintenance courante. Au lieu de cela, utilisez DBCC CLEANTABLE si vous avez apporté des modifications significatives aux colonnes de longueur variable d’une table ou d’une vue indexée, et que vous devez récupérer immédiatement l’espace inutilisé. Une autre solution consiste à reconstruire les index sur la table ou vue ; toutefois, cette opération consomme davantage de ressources.

Jeu de résultats

DBCC CLEANTABLE retourne :

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

Autorisations

L’appelant doit être propriétaire de la table ou de la vue indexée, ou être membre du rôle serveur fixe sysadmin, du rôle de base de données fixe db_owner ou du rôle de base de données fixe db_ddladmin.

Exemples

R. Utiliser DBCC CLEANTABLE pour récupérer de l’espace

L’exemple suivant exécute DBCC CLEANTABLE pour la table Production.Document de l’exemple de base de données AdventureWorks2022.

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

B. Utiliser DBCC CLEANTABLE et vérifier les résultats

L'exemple suivant crée une table puis la remplit avec plusieurs colonnes de longueur variable. Deux des colonnes sont ensuite supprimées et DBCC CLEANTABLE est exécuté pour récupérer l’espace inutilisé. Une requête est exécutée pour vérifier les valeurs du nombre de pages et d’espace utilisé avant et après l’exécution de la commande DBCC CLEANTABLE.

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