Compartir a través de


DBCC CLEANTABLE (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Recupera el espacio de columnas de longitud variable quitadas de tablas o vistas indizadas.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

database_name | database_id | 0

La base de datos a la que pertenece la tabla que se va a limpiar. Si se especifica 0, se utiliza la base de datos actual. Los nombres de las bases de datos deben cumplir las reglas de los identificadores.

table_name | table_id | view_name | view_id

La tabla o la vista indizada que se va a limpiar.

batch_size

El número de filas procesadas por transacción. Si no se especifica, el valor predeterminado es 1000. Para evitar un período de recuperación largo, no se permite 0.

WITH NO_INFOMSGS

Suprime todos los mensajes de información.

Observaciones

DBCC CLEANTABLE recupera el espacio que deja una columna de longitud variable quitada. Una columna de longitud variable puede tener uno de los siguientes tipos de datos: varchar, nvarchar, varchar(max) , nvarchar(max) , varbinary, varbinary(max) , text, ntext, image, sql_variant y xml. El comando no recupera espacio después de que se haya quitado una columna de longitud fija.

Si las columnas quitadas estuvieran almacenadas de manera consecutiva, DBCC CLEANTABLE recupera espacio de la unidad de asignación IN_ROW_DATA de la tabla. Si estuvieran almacenadas de manera no consecutiva, se recupera espacio de la unidad de asignación ROW_OVERFLOW_DATA o LOB_DATA en función del tipo de datos de la columna quitada. Si al recuperar espacio de una página ROW_OVERFLOW_DATA o LOB_DATA se crea una página vacía, DBCC CLEANTABLE la quita.

DBCC CLEANTABLE se ejecuta como una o varias transacciones. Si no se especifica un tamaño de lote, el tamaño predeterminado es 1000. Para algunas tablas grandes, la longitud de una transacción y el espacio de registro necesario puede ser muy grande. Si se especifica un tamaño de proceso por lotes, el comando se ejecuta en una serie de transacciones; cada una de ellas incluye el número de filas especificado. DBCC CLEANTABLE no se puede ejecutar como una transacción dentro de otra transacción.

Esta operación se registra por completo.

DBCC CLEANTABLE no se admite para su uso en tablas del sistema, tablas temporales o la parte de índice de almacén de columnas optimizado para memoria de una tabla.

Procedimientos recomendados

DBCC CLEANTABLE no debe ejecutarse como una tarea de mantenimiento rutinaria. En lugar de ello, use DBCC CLEANTABLE después de realizar cambios significativos en columnas de longitud variable de una tabla o vista indizada, y hay que recuperar inmediatamente el espacio sin usar. Como alternativa, puede volver a generar los índices en la tabla o vista; no obstante, esta operación consume más recursos.

Conjuntos de resultados

DBCC CLEANTABLE devuelve lo siguiente:

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

Permisos

El que llama debe ser propietario de la tabla o vista indexada, o miembro del rol fijo de servidor sysadmin, del rol fijo de base de datos db_owner o del rol fijo de base de datos db_ddladmin.

Ejemplos

A. Uso de DBCC CLEANTABLE para recuperar espacio

En el ejemplo siguiente se ejecuta DBCC CLEANTABLE para la tabla Production.Document de la base de datos de ejemplo AdventureWorks2022.

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

B. Uso de DBCC CLEANTABLE y comprobación de resultados

En el ejemplo siguiente se crea y llena una tabla con varias columnas de longitud variable. Después se quitan dos columnas y se ejecuta DBCC CLEANTABLE para recuperar el espacio sin usar. Se ejecuta una consulta para comprobar los valores del recuento de páginas y el espacio ocupado antes y después de ejecutar el comando 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

Consulte también