Sdílet prostřednictvím


DBCC SHOWCONTIG (Transact-SQL)

platí pro:SQL Serverazure SQL Managed Instance

Zobrazí informace o fragmentaci dat a indexů zadané tabulky nebo zobrazení.

Důležitý

Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají. Místo toho použijte sys.dm_db_index_physical_stats.

platí pro: SQL Server 2008 (10.0.x) a novější verze

Transact-SQL konvence syntaxe

Syntax

DBCC SHOWCONTIG
[ (
    { table_name | table_id | view_name | view_id }
    [ , index_name | index_id ]
) ]
    [ WITH
        {
         [ , [ ALL_INDEXES ] ]
         [ , [ TABLERESULTS ] ]
         [ , [ FAST ] ]
         [ , [ ALL_LEVELS ] ]
         [ NO_INFOMSGS ]
         }
    ]

Argumenty

table_name | table_id | view_name | view_id

Tabulka nebo zobrazení pro kontrolu informací o fragmentaci Pokud není zadáno, zkontrolují se všechny tabulky a indexovaná zobrazení v aktuální databázi. K získání ID tabulky nebo zobrazení použijte funkci OBJECT_ID.

index_name | index_id

Index, který kontroluje informace o fragmentaci. Pokud není zadaný, příkaz zpracuje základní index pro zadanou tabulku nebo zobrazení. K získání ID indexu použijte sys.indexes zobrazení katalogu.

S

Určuje možnosti pro typ informací vrácených příkazem DBCC.

RYCHLÝ

Určuje, jestli se má provést rychlé prohledávání indexu a výstupu minimálních informací. Rychlá kontrola nečte stránky na úrovni listu ani dat indexu.

ALL_INDEXES

Zobrazí výsledky pro všechny indexy pro zadané tabulky a zobrazení, i když je zadaný konkrétní index.

TABLERESULTS

Zobrazí výsledky jako sadu řádků s dalšími informacemi.

ALL_LEVELS

Udržuje se pouze kvůli zpětné kompatibilitě. I když je zadán ALL_LEVELS, zpracuje se pouze úroveň listu indexu nebo dat tabulky.

NO_INFOMSGS

Potlačí všechny informační zprávy, které mají úrovně závažnosti od 0 do 10.

Sady výsledků

Následující tabulka popisuje informace v sadě výsledků.

Statistický Popis
Stránky skenované Počet stránek v tabulce nebo indexu
rozsahy prohledávány Počet rozsahů v tabulce nebo indexu
přepínače rozsahu Kolikrát se příkaz DBCC přesunul z jednoho rozsahu do jiného, zatímco příkaz prošel stránkami tabulky nebo indexu.
Prům. Stránky na rozsah Počet stránek v rozsahu v řetězci stránek
Hustota skenování [Nejlepší počet: Skutečný počet] Procento. Je to poměr nejlepší počet k skutečný počet. Tato hodnota je 100, pokud je vše souvislé; pokud je tato hodnota menší než 100, existuje určitá fragmentace.

nejlepší počet je ideální počet změn rozsahu, pokud je vše souvisle propojené. Skutečný počet je skutečný počet změn rozsahu.
fragmentace logické kontroly Procento stránek mimo pořadí vrácených z prohledávání listových stránek indexu Toto číslo není relevantní pro haldy. Stránka mimo pořadí je stránka, na kterou další fyzická stránka přidělená indexu není stránkou, na kterou odkazuje další stránkovacíe ukazatel na aktuální stránce listu.
fragmentace kontroly rozsahu Procento rozsahů mimo pořadí při skenování listových stránek indexu Toto číslo není relevantní pro haldy. Rozsah mimo pořadí je takový, pro který rozsah, který obsahuje aktuální stránku indexu, není fyzicky dalším rozsahem za rozsahem, který obsahuje předchozí stránku indexu.

Poznámka: Toto číslo je bezvýznamné, pokud index pokrývá více souborů.
Průměr. Bajty zdarma na stránku Průměrný počet volných bajtů naskenovaných stránkách Čím je číslo větší, tím méně zaplní stránky. Nižší čísla jsou lepší, pokud index nebude obsahovat mnoho náhodných vložení. Toto číslo je ovlivněno také velikostí řádku; Velká velikost řádku může způsobit větší číslo.
Avg. Page density (full) Průměrná hustota stránky jako procento Tato hodnota bere v úvahu velikost řádku. Proto je hodnota přesnější indikací, jak jsou vaše stránky plné. Čím větší je procento, tím lépe.

Pokud zadáte table_id a FAST, DBCC SHOWCONTIG vrátí sadu výsledků pouze s následujícími sloupci:

  • Stránky skenované
  • přepínače rozsahu
  • Hustota skenování [Nejlepší počet:Skutečný počet]
  • fragmentace kontroly rozsahu
  • fragmentace logické kontroly

Když TABLERESULTS zadáte, DBCC SHOWCONTIG vrátí následující sloupce a také devět sloupců popsaných v předchozí tabulce.

Statistický Popis
názvu objektu Název zpracované tabulky nebo zobrazení
ObjectId ID názvu objektu.
indexu Název zpracovaného indexu NULL pro haldu.
IndexId ID indexu. 0 pro haldu.
úrovně Úroveň indexu Úroveň 0 je úroveň listu nebo dat indexu.

Úroveň je 0 pro haldu.
stránky Počet stránek, které tvoří danou úroveň indexu nebo celé haldy
řádky Počet dat nebo indexových záznamů na této úrovni indexu U haldy je tato hodnota počet datových záznamů v celé haldě.

U haldy nemusí počet záznamů vrácených z této funkce odpovídat počtu řádků vrácených spuštěním SELECT COUNT(*) proti haldě. Důvodem je to, že řádek může obsahovat více záznamů. Například v některých situacích aktualizace může mít jeden řádek haldy záznam pro předávání a přesměrovaný záznam v důsledku operace aktualizace. Většina velkých obchodních řádků je také rozdělena do několika záznamů v úložišti LOB_DATA.
MinimumZáznam Minimální velikost záznamu na této úrovni indexu nebo celé haldy.
MaximumRecordSize Maximální velikost záznamu na této úrovni indexu nebo celé haldy
AverageRecordSize Průměrná velikost záznamu na této úrovni indexu nebo celé haldy
přeposlanýchzáznamů Počet přeposlaných záznamů na této úrovni indexu nebo celé haldy.
rozsahy Počet rozsahů v této úrovni indexu nebo celé haldy
ExtentSwitches Kolikrát se příkaz DBCC přesunul z jednoho rozsahu do jiného, zatímco příkaz prošel stránkami tabulky nebo indexu.
AverageFreeBytes Průměrný počet volných bajtů naskenovaných stránkách Čím je číslo větší, tím méně zaplní stránky. Nižší čísla jsou lepší, pokud index nebude obsahovat mnoho náhodných vložení. Toto číslo je ovlivněno také velikostí řádku; Velká velikost řádku může způsobit větší číslo.
AveragePageDensity Průměrná hustota stránky jako procento Tato hodnota bere v úvahu velikost řádku. Proto je hodnota přesnější indikací, jak jsou vaše stránky plné. Čím větší je procento, tím lépe.
ScanDensity Procento. Je to poměr BestCount k ActualCount. Tato hodnota je 100, pokud je vše souvislé; pokud je tato hodnota menší než 100, existuje určitá fragmentace.
BestCount Ideální počet změn rozsahu, pokud je vše souvisle propojené.
ActualCount Skutečný počet změn rozsahu.
LogicalFragmentation Procento stránek mimo pořadí vrácených z prohledávání listových stránek indexu Toto číslo není relevantní pro haldy. Stránka mimo pořadí je stránka, na kterou další fyzická stránka přidělená indexu není stránkou, na kterou odkazuje další stránka ukazatel na aktuální stránce listu.
ExtentFragmentation Procento rozsahů mimo pořadí při skenování listových stránek indexu Toto číslo není relevantní pro haldy. Rozsah mimo pořadí je takový, pro který rozsah, který obsahuje aktuální stránku indexu, není fyzicky dalším rozsahem za rozsahem, který obsahuje předchozí stránku indexu.

Poznámka: Toto číslo je bezvýznamné, pokud index pokrývá více souborů.

Při zadání WITH TABLERESULTS a FAST je sada výsledků stejná jako při zadání WITH TABLERESULTS, s výjimkou následujících sloupců budou mít hodnoty null:

Řádky Rozsahy
MinimumZáznam AverageFreeBytes
MaximumRecordSize AveragePageDensity
AverageRecordSize ExtentFragmentation
přeposlanýchzáznamů

Poznámky

Příkaz DBCC SHOWCONTIG prochází řetězem stránek na úrovni listu zadaného indexu při zadání index_id. Pokud je zadána pouze table_id nebo je index_id 0, zkontrolují se datové stránky zadané tabulky. Operace vyžaduje pouze zámek tabulky se sdíleným záměrem (IS). Tímto způsobem lze provádět všechny aktualizace a vložení s výjimkou těch, které vyžadují zámek exkluzivní tabulky (X). To umožňuje kompromis mezi rychlostí provádění a žádným snížením souběžnosti oproti počtu vrácených statistik. Pokud se však příkaz používá pouze k měření fragmentace, doporučujeme použít možnost WITH FAST pro optimální výkon. Rychlá kontrola nečte stránky na úrovni listu ani dat indexu. Možnost WITH FAST se nevztahuje na haldu.

Omezení

DBCC SHOWCONTIG nezobrazuje data s textu, textovýmia datovými typy obrázku. Důvodem je to, že textové indexy, které ukládají textová a obrazová data, již neexistují.

DBCC SHOWCONTIG také nepodporuje některé nové funkce. Například:

  • Pokud je zadaná tabulka nebo index rozdělená na oddíly, DBCC SHOWCONTIG zobrazí pouze první oddíl zadané tabulky nebo indexu.
  • DBCC SHOWCONTIG nezobrazuje informace o úložišti přetečení řádků a další nové datové typy mimo řádky, například nvarchar(max), varchar(max), varbinary(max)a xml.
  • Prostorové indexy nejsou podporovány DBCC SHOWCONTIG.

Všechny nové funkce plně podporují sys.dm_db_index_physical_stats (Transact-SQL) zobrazení dynamické správy.

Fragmentace tabulek

DBCC SHOWCONTIG určuje, jestli je tabulka silně fragmentovaná. Fragmentace tabulky probíhá prostřednictvím procesu úprav dat (příkazy INSERT, UPDATE a DELETE) provedené v tabulce. Vzhledem k tomu, že tyto úpravy nejsou obvykle distribuovány rovnoměrně mezi řádky tabulky, může se plná část každé stránky v průběhu času lišit. U dotazů, které kontrolují část nebo celou tabulku, může taková fragmentace tabulky způsobit další čtení stránek. To brání paralelní kontrole dat.

Při velké fragmentaci indexu jsou k dispozici následující možnosti pro snížení fragmentace:

  • Odstraňte a znovu vytvořte clusterovaný index.

    Opětovné vytvoření clusterovaného indexu přeorganizuje data a způsobí úplné datové stránky. Úroveň úplnosti lze nakonfigurovat pomocí možnosti FILLFACTOR v CREATE INDEX. Nevýhodou této metody je, že index je offline během poklesu nebo opětovného vytvoření cyklu a že operace je atomická. Pokud se vytváření indexu přeruší, index se znovu nevytvořil.

  • Změna pořadí stránek indexu na úrovni listu v logickém pořadí

    Pomocí ALTER INDEX...REORGANIZE můžete změnit pořadí stránek indexu na úrovni listu v logickém pořadí. Vzhledem k tomu, že tato operace je online operace, je index k dispozici při spuštění příkazu. Operace je také přerušena bez ztráty dokončené práce. Nevýhodou této metody je, že metoda nedělá tak dobrou úlohu, jak změnit uspořádání dat jako vyřazení clusterovaného indexu nebo operaci opětovného vytvoření.

  • Znovu sestavte index.

    K opětovnému sestavení indexu použijte ALTER INDEX s REBUILD. Další informace naleznete v tématu ALTER INDEX (Transact-SQL).

Průměr. Bajty volné na stránku a Průměr. Hustota stránky (úplná) statistika v sadě výsledků označuje úplnost indexových stránek. Průměr. Počet bajtů volný na stránku by měl být nízký a Průměr. Hustota stránky (úplná) číslo by mělo být vysoké pro index, který nebude obsahovat mnoho náhodných vložení. Vyřazení a opětovné vytvoření indexu se zadanou možností FILLFACTOR může statistiku zlepšit. Také ALTER INDEX s REORGANIZE zkomprimuje index s ohledem na jeho FILLFACTORa zlepší statistiky.

Poznámka

Index, který obsahuje mnoho náhodných vložení a velmi celé stránky, bude mít větší počet rozdělení stránek. To způsobuje větší fragmentaci.

Úroveň fragmentace indexu lze určit následujícími způsoby:

  • Porovnáním hodnot přepínačů rozsahu a rozsahů.

    Hodnota přepínačů rozsahu by měla být co nejblíže hodnotě Rozsahy prohledávány. Tento poměr se vypočítá jako hodnota Hustota skenování. Tato hodnota by měla být co nejvyšší a dá se zlepšit snížením fragmentace indexů.

    Poznámka

    Tato metoda nefunguje, pokud index zahrnuje více souborů.

  • Pochopením fragmentace logické kontroly a hodnot fragmentace rozsahu kontroly.

    fragmentace logické kontroly a rozsahu fragmentace kontroly hodnoty jsou nejlepšími indikátory úrovně fragmentace tabulky. Obě tyto hodnoty by měly být co nejblíže nule, i když hodnota od 0 do 10 procent může být přijatelná.

    Poznámka

    Hodnota fragmentace rozsahu kontroly bude vysoká, pokud index přesahuje více souborů. Chcete-li tyto hodnoty snížit, musíte snížit fragmentaci indexu.

Dovolení

Uživatel musí vlastnit tabulku nebo být členem správce systému pevné role serveru, db_owner pevné databázové role nebo db_ddladmin pevné databázové role.

Příklady

A. Zobrazení informací o fragmentaci tabulky

Následující příklad zobrazuje informace o fragmentaci tabulky Employee.

USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('HumanResources.Employee');
GO

B. Získání ID tabulky a sys.indexů k získání ID indexu pomocí OBJECT_ID

Následující příklad používá OBJECT_ID a zobrazení katalogu sys.indexes k získání ID tabulky a id indexu pro AK_Product_Name index tabulky Production.Product v databázi AdventureWorks2022.

USE AdventureWorks2022;
GO
DECLARE @id INT, @indid INT
SET @id = OBJECT_ID('Production.Product');

SELECT @indid = index_id
FROM sys.indexes
WHERE object_id = @id
   AND name = 'AK_Product_Name';

DBCC SHOWCONTIG (@id, @indid);
GO

C. Zobrazení zkrácené sady výsledků pro tabulku

Následující příklad vrátí zkrácenou sadu výsledků pro tabulku Product v AdventureWorks2022 databázi.

USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('Production.Product', 1) WITH FAST;
GO

D. Zobrazení úplné sady výsledků pro každý index v každé tabulce v databázi

Následující příklad vrátí úplnou sadu výsledků tabulky pro každý index pro každou tabulku v AdventureWorks2022 databázi.

USE AdventureWorks2022;
GO
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES;
GO

E. Defragmentace indexů v databázi pomocí DBCC SHOWCONTIG a DBCC INDEXDEFRAG

Následující příklad ukazuje jednoduchý způsob defragmentace všech indexů v databázi, která je fragmentována nad deklarovanou prahovou hodnotu.

/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename VARCHAR(255);
DECLARE @execstr   VARCHAR(400);
DECLARE @objectid  INT;
DECLARE @indexid   INT;
DECLARE @frag      DECIMAL;
DECLARE @maxfrag   DECIMAL;
  
-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;
  
-- Declare a cursor.
DECLARE tables CURSOR FOR
   SELECT TABLE_SCHEMA + '.' + TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE';
  
-- Create the table.
CREATE TABLE #fraglist (
   ObjectName CHAR(255),
   ObjectId INT,
   IndexName CHAR(255),
   IndexId INT,
   Lvl INT,
   CountPages INT,
   CountRows INT,
   MinRecSize INT,
   MaxRecSize INT,
   AvgRecSize INT,
   ForRecCount INT,
   Extents INT,
   ExtentSwitches INT,
   AvgFreeBytes INT,
   AvgPageDensity INT,
   ScanDensity DECIMAL,
   BestCount INT,
   ActualCount INT,
   LogicalFrag DECIMAL,
   ExtentFrag DECIMAL);
  
-- Open the cursor.
OPEN tables;
  
-- Loop through all the tables in the database.
FETCH NEXT
   FROM tables
   INTO @tablename;
  
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
   INSERT INTO #fraglist
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
   FETCH NEXT
      FROM tables
      INTO @tablename;
END;
  
-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;
  
-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
   WHERE LogicalFrag >= @maxfrag
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
  
-- Open the cursor.
OPEN indexes;
  
-- Loop through the indexes.
FETCH NEXT
   FROM indexes
   INTO @tablename, @objectid, @indexid, @frag;
  
WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
      ' + RTRIM(@indexid) + ') - fragmentation currently '
       + RTRIM(CONVERT(varchar(15),@frag)) + '%';
   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
       ' + RTRIM(@indexid) + ')';
   EXEC (@execstr);
  
   FETCH NEXT
      FROM indexes
      INTO @tablename, @objectid, @indexid, @frag;
END;
  
-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;
  
-- Delete the temporary table.
DROP TABLE #fraglist;
GO

Viz také

  • ALTER INDEX (Transact-SQL)
  • CREATE INDEX (Transact-SQL)
  • DBCC (Transact-SQL)
  • DROP INDEX (Transact-SQL)
  • sys.dm_db_index_physical_stats (Transact-SQL)
  • OBJECT_ID (Transact-SQL)
  • sys.indexes (Transact-SQL)