Dela via


DBCC CLEANTABLE (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Frigör utrymme från borttagna kolumner med variabel längd i tabeller eller indexerade vyer.

Transact-SQL syntaxkonventioner

Syntax

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

Argument

database_name | database_id | 0

Databasen där tabellen som ska rensas tillhör. Om 0 anges används den aktuella databasen. Databasnamn måste följa reglerna för identifierare.

table_name | table_id | view_name | view_id

Den tabell eller indexerade vy som ska rensas.

batch_size

Antalet rader som bearbetas per transaktion. Om det inte anges är standardvärdet 1000.

Värdet 0 stöds inte och rekommenderas inte för att undvika en lång återställningsperiod.

MED NO_INFOMSGS

Undertrycker alla informationsmeddelanden.

Anmärkningar

DBCC CLEANTABLE frigör utrymme när en kolumn med variabel längd har tagits bort. En kolumn med variabel längd kan vara en av följande datatyper: varchar, nvarchar, varchar(max), nvarchar(max), varbinary, varbinary(max), text, ntext, image, sql_variantoch xml. Kommandot frigör inte utrymme när en kolumn med fast längd har tagits bort.

Om de borttagna kolumnerna lagrades på rad DBCC CLEANTABLE frigör utrymme från tabellens IN_ROW_DATA allokeringsenhet. Om kolumnerna har lagrats utanför rad frigörs utrymme från antingen ROW_OVERFLOW_DATA eller LOB_DATA allokeringsenhet beroende på datatypen för den borttagna kolumnen. Om frigörande av utrymme från en ROW_OVERFLOW_DATA eller LOB_DATA sida resulterar i en tom sida tar DBCC CLEANTABLE bort sidan.

DBCC CLEANTABLE körs som en eller flera transaktioner. Om en batchstorlek inte har angetts är standardstorleken 1000. För vissa stora tabeller kan längden på den enskilda transaktionen och det loggutrymme som krävs vara för mycket. Om en batchstorlek anges körs kommandot i en serie transaktioner, inklusive det angivna antalet rader. DBCC CLEANTABLE kan inte köras som en transaktion i en annan transaktion.

Den här åtgärden är helt loggad.

DBCC CLEANTABLE stöds inte för användning på systemtabeller, temporära tabeller eller den minnesoptimerade kolumnlagringsindexdelen i en tabell.

Metodtips

DBCC CLEANTABLE ska inte köras som en rutinunderhållsuppgift. Använd i stället DBCC CLEANTABLE när du har ändrat kolumner med variabel längd i en tabell eller indexerad vy och du måste omedelbart frigöra det oanvända utrymmet. Du kan också återskapa indexen i tabellen eller vyn. Detta är dock en mer resursintensiv åtgärd.

Resultatuppsättning

DBCC CLEANTABLE returnerar:

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

Behörigheter

Anroparen måste äga tabellen eller den indexerade vyn, eller vara medlem i sysadmin fast serverroll, db_owner fast databasroll eller db_ddladmin fast databasroll.

Exempel

A. Använd DBCC CLEANTABLE för att frigöra utrymme

I följande exempel körs DBCC CLEANTABLE för tabellen Production.Document i AdventureWorks2022 exempeldatabas.

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

B. Använda DBCC CLEANTABLE och verifiera resultat

I följande exempel skapas och fylls en tabell med flera kolumner med variabel längd. Två av kolumnerna tas sedan bort och DBCC CLEANTABLE körs för att frigöra det oanvända utrymmet. En fråga körs för att verifiera antalet sidor och det utrymme som används före och efter att kommandot DBCC CLEANTABLE har körts.

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