Sdílet prostřednictvím


DBCC CLEANTABLE (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Uvolní místo z vyřazených sloupců s proměnlivou délkou v tabulkách nebo indexovaných zobrazeních.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

database_name | database_id | 0

Databáze, do které má být tabulka vyčištěna, patří. Pokud je zadána hodnota 0, použije se aktuální databáze. Názvy databází musí dodržovat pravidla pro identifikátory .

table_name | table_id | view_name | view_id

Tabulka nebo indexované zobrazení, které se má vyčistit.

batch_size

Počet řádků zpracovaných na transakci. Pokud není zadána, výchozí hodnota je 1000.

Hodnota 0 není podporována a nedoporučuje se, aby se zabránilo dlouhému období obnovení.

WITH NO_INFOMSGS

Potlačí všechny informační zprávy.

Poznámky

DBCC CLEANTABLE uvolní místo po vyřazení sloupce s proměnnou délkou. Sloupec s proměnnou délkou může být jedním z následujících datových typů: varchar, nvarchar, varchar(max), nvarchar(max), varbinary , varbinary(max), text, ntext, obrázek, sql_varianta xml. Příkaz po vyřazení sloupce s pevnou délkou neuloží mezeru.

Pokud byly vyřazené sloupce uloženy v řádku, DBCC CLEANTABLE uvolní místo z IN_ROW_DATA alokační jednotky tabulky. Pokud byly sloupce uloženy mimo řádek, uvolní se mezera z ROW_OVERFLOW_DATA nebo LOB_DATA alokační jednotky v závislosti na datovém typu vyřazeného sloupce. Pokud uvolnění místa z ROW_OVERFLOW_DATA nebo LOB_DATA stránky způsobí prázdnou stránku, DBCC CLEANTABLE stránku odebere.

DBCC CLEANTABLE běží jako jedna nebo více transakcí. Pokud není zadaná velikost dávky, výchozí velikost je 1000. U některých velkých tabulek může být délka jedné transakce a požadovaného místa protokolu příliš velká. Pokud je zadána velikost dávky, příkaz se spustí v řadě transakcí, z nichž každý zahrnuje zadaný počet řádků. DBCC CLEANTABLE nelze spustit jako transakci uvnitř jiné transakce.

Tato operace je plně protokolovaná.

DBCC CLEANTABLE se nepodporuje pro použití v systémových tabulkách, dočasných tabulkách ani v části indexu columnstore optimalizované pro paměť v tabulce.

Osvědčené postupy

DBCC CLEANTABLE by se nemělo spouštět jako rutinní úloha údržby. Místo toho použijte DBCC CLEANTABLE po provedení významných změn sloupců s proměnlivou délkou v tabulce nebo indexovaného zobrazení a musíte okamžitě uvolnit nevyužité místo. Případně můžete znovu sestavit indexy v tabulce nebo zobrazení; Je to však operace náročná na prostředky.

Sada výsledků

DBCC CLEANTABLE vrátí:

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

Dovolení

Volající musí vlastnit tabulku nebo indexované zobrazení nebo být členem správce systému pevnou roli serveru, db_owner pevnou roli databáze nebo db_ddladmin pevnou roli databáze.

Příklady

A. Uvolnění místa pomocí DBCC CLEANTABLE

Následující příklad spustí DBCC CLEANTABLE pro tabulku Production.Document v ukázkové databázi AdventureWorks2022.

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

B. Použití tabulky DBCC CLEANTABLE a ověření výsledků

Následující příklad vytvoří a naplní tabulku několika sloupci s proměnlivou délkou. Dva sloupce se pak zahodí a DBCC CLEANTABLE se spustí a uvolní nevyužité místo. Spustí se dotaz, který ověří počet stránek a využité hodnoty před a po provedení příkazu 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
  • DBCC (Transact-SQL)
  • sys.allocation_units (Transact-SQL)