DBCC SHOWCONTIG (Transact-SQL)
platí pro:SQL Server
azure 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
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
vCREATE 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
sREBUILD
. 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 FILLFACTOR
a 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)