Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Managed Instance
Toont fragmentatie-informatie voor de data en indexen van de gespecificeerde tabel of weergave.
Belangrijk
Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie. Gebruik sys.dm_db_index_physical_stats in plaats daarvan.
Van toepassing op: SQL Server 2008 (10.0.x) en latere versies
Transact-SQL syntaxis-conventies
Syntaxis
DBCC SHOWCONTIG
[ (
{ table_name | table_id | view_name | view_id }
[ , index_name | index_id ]
) ]
[ WITH
{
[ , [ ALL_INDEXES ] ]
[ , [ TABLERESULTS ] ]
[ , [ FAST ] ]
[ , [ ALL_LEVELS ] ]
[ NO_INFOMSGS ]
}
]
Arguments
table_name | table_id | view_name | view_id
De tabel of weergave om fragmentatie-informatie te controleren. Indien niet gespecificeerd, worden alle tabellen en geïndexeerde weergaven in de huidige database gecontroleerd. Om de tabel- of weergave-ID te verkrijgen, gebruik je de functie OBJECT_ID .
index_name | index_id
De index om fragmentatie-informatie te controleren. Indien niet gespecificeerd, verwerkt de instructie de basisindex voor de gespecificeerde tabel of weergave. Om de index-ID te verkrijgen, gebruik je de sys.indexes catalogusweergave.
WITH
Specificeert opties voor het type informatie dat door de DBCC-instructie wordt teruggegeven.
SNEL
Geeft aan of een snelle scan van de index moet worden uitgevoerd en minimale informatie moet worden uitgevoerd. Een snelle scan leest niet de blad- of dataniveaupagina's van de index.
ALL_INDEXES
Toont resultaten voor alle indexen voor de opgegeven tabellen en weergaven, zelfs als een bepaalde index is gespecificeerd.
TABLERESULTS
Toont resultaten als een rijset, met aanvullende informatie.
ALL_LEVELS
Alleen onderhouden voor achterwaartse compatibiliteit. Zelfs als ALL_LEVELS gespecificeerd is, wordt alleen het indexbladniveau of tabeldataniveau verwerkt.
NO_INFOMSGS
Onderdrukt alle informatieve berichten met ernstniveaus van 0 tot en met 10.
Resultatensets
In de volgende tabel worden de gegevens in de resultatenset beschreven.
| Statistiek | Description |
|---|---|
| Gescande pagina's | Aantal pagina's in de tabel of index. |
| Uitgestrekte Scans | Aantal extents in de tabel of index. |
| Omvangswisselingen | Aantal keren dat de DBCC-instructie van de ene omvang naar de andere bewoog terwijl de verklaring de pagina's van de tabel of index doorliep. |
| Gemiddeld aantal pagina's per omvang | Aantal pagina's per gedeelte in de paginaketen. |
| Scandichtheid [Beste telling: Werkelijke aantal] | Een percentage. Het is de verhouding Beste Telling tot Werkelijke Aantal. Deze waarde is 100 als alles aaneengesloten is; als deze waarde kleiner is dan 100, bestaat er enige fragmentatie. Best Count is het ideale aantal extent-veranderingen als alles aaneengesloten met elkaar verbonden is. Werkelijke Telling is het werkelijke aantal veranderingen in de omvang. |
| Logische Scanfragmentatie | Percentage van de pagina's die niet in volgorde zijn teruggebracht door het scannen van de bladpagina's van een index. Dit getal is niet relevant voor heaps. Een out-of-order-pagina is een pagina waarvoor de volgende fysieke pagina die aan de index wordt toegewezen niet de pagina is waarnaar wordt verwezen door de next-pagee-pointer in de huidige bladpagina. |
| Fragmentatie van de Extent Scan | Percentage van de uit-volgorde extensies bij het scannen van de bladpagina's van een index. Dit getal is niet relevant voor heaps. Een out-of-order extent is er een waarbij de extent die de huidige pagina van een index bevat fysiek niet de volgende extent is na de extent die de vorige pagina voor een index bevat. Notitie: Dit getal is betekenisloos wanneer de index meerdere bestanden beslaat. |
| Gemiddelde bytes gratis per pagina | Gemiddeld aantal vrije bytes op de gescande pagina's. Hoe groter het getal, hoe minder vol de pagina's zijn. Lagere getallen zijn beter als de index niet veel willekeurige inserts bevat. Dit aantal wordt ook beïnvloed door de rijgrootte; Een grote rijgrootte kan een groter aantal veroorzaken. |
| Gemiddelde paginadichtheid (volledig) | Gemiddelde paginadichtheid, als percentage. Deze waarde houdt rekening met de rijgrootte. Daarom is de waarde een nauwkeuriger indicatie van hoe vol je pagina's zijn. Hoe groter het percentage, hoe beter. |
Wanneer table_id en FAST zijn opgegeven, DBCC SHOWCONTIG geeft een resultaatset terug met alleen de volgende kolommen:
- Gescande pagina's
- Omvangswisselingen
- Scandichtheid [Beste telling: Werkelijke aantal]
- Fragmentatie van de Extent Scan
- Logische Scanfragmentatie
Wanneer TABLERESULTS is gespecificeerd, DBCC SHOWCONTIG geeft de volgende kolommen terug en ook de negen kolommen die in de vorige tabel zijn beschreven.
| Statistiek | Description |
|---|---|
| Objectnaam | Naam van de tabel of weergave die wordt verwerkt. |
| Object-id | ID van de objectnaam. |
| IndexName | Naam van de bewerkte index. NULL voor een hoop. |
| IndexId | Id van de index. 0 voor een hoop. |
| Niveau | Niveau van de index. Niveau 0 is het blad- of dataniveau van de index. Level is 0 voor een heap. |
| Pages | Aantal pagina's dat dat niveau van de index of hele heap vormt. |
| Rows | Aantal gegevens of indexrecords op dat niveau van de index. Voor een heap is deze waarde het aantal datarecords in de hele heap. Voor een heap hoeft het aantal records dat vanuit deze functie wordt geretourneerd niet overeen te komen met het aantal rijen dat wordt teruggegeven door een SELECT COUNT(*) tegen de heap uit te voeren. Dit komt doordat een rij meerdere records kan bevatten. Bijvoorbeeld, in sommige updatesituaties kan een enkele heaprij een doorstuurrecord en een doorgestuurd record hebben als gevolg van de updatebewerking. Bovendien worden de meeste grote LOB-rijen in LOB_DATA opslag opgesplitst in meerdere records. |
| MinimumRecordSize | Minimale recordgrootte op dat niveau van de index of whole heap. |
| MaximumRecordSize | Maximale recordgrootte in dat niveau van de index of hele heap. |
| AverageRecordSize | Gemiddelde recordgrootte op dat niveau van de index of hele heap. |
| DoorgestuurdeRecords | Aantal doorgestuurde records op dat niveau van de index of hele heap. |
| Mate | Aantal extents in dat niveau van de index of hele heap. |
| ExtentSwitches | Aantal keren dat de DBCC-instructie van de ene omvang naar de andere bewoog terwijl de verklaring de pagina's van de tabel of index doorliep. |
| AverageFreeBytes | Gemiddeld aantal vrije bytes op de gescande pagina's. Hoe groter het getal, hoe minder vol de pagina's zijn. Lagere getallen zijn beter als de index niet veel willekeurige inserts bevat. Dit aantal wordt ook beïnvloed door de rijgrootte; Een grote rijgrootte kan een groter aantal veroorzaken. |
| AveragePageDensity | Gemiddelde paginadichtheid, als percentage. Deze waarde houdt rekening met de rijgrootte. Daarom is de waarde een nauwkeuriger indicatie van hoe vol je pagina's zijn. Hoe groter het percentage, hoe beter. |
| ScanDensity | Een percentage. Het is de verhouding BestCount tot ActualCount. Deze waarde is 100 als alles aaneengesloten is; als deze waarde kleiner is dan 100, bestaat er enige fragmentatie. |
| BestCount | Het ideale aantal omvang verandert als alles aaneengesloten met elkaar verbonden is. |
| ActualCount | Het werkelijke aantal omvang verandert. |
| LogicalFragmentatie | Percentage van de pagina's die niet in volgorde zijn teruggebracht door het scannen van de bladpagina's van een index. Dit getal is niet relevant voor heaps. Een verouderde pagina is een pagina waarvoor de volgende fysieke pagina die is toegewezen aan de index niet de pagina is waarnaar de volgende pagina aanwijzer op de huidige bladpagina wijst. |
| OmvangFragmentatie | Percentage van de uit-volgorde extensies bij het scannen van de bladpagina's van een index. Dit getal is niet relevant voor heaps. Een out-of-order extent is er een waarbij de extent die de huidige pagina van een index bevat fysiek niet de volgende extent is na de extent die de vorige pagina voor een index bevat. Notitie: Dit getal is betekenisloos wanneer de index meerdere bestanden beslaat. |
Wanneer WITH TABLERESULTS en FAST worden gespecificeerd, is de resultaatverzameling hetzelfde als wanneer WITH TABLERESULTS is gespecificeerd, behalve dat de volgende kolommen nulwaarden zullen hebben:
| Rows | Mate |
|---|---|
| MinimumRecordSize | AverageFreeBytes |
| MaximumRecordSize | AveragePageDensity |
| AverageRecordSize | OmvangFragmentatie |
| DoorgestuurdeRecords |
Opmerkingen
De DBCC SHOWCONTIG instructie doorloopt de paginaketen op bladniveau van de gespecificeerde index wanneer index_id is gespecificeerd. Als slechts table_id is opgegeven of als index_id 0 is, worden de datapagina's van de opgegeven tabel gescand. De operatie vereist alleen een intent-shared (IS) tabelvergrendeling. Op deze manier kunnen alle updates en inserts worden uitgevoerd, behalve die welke een exclusieve (X) table lock vereisen. Dit maakt een afweging mogelijk tussen de snelheid van uitvoering en het niet verminderen van gelijktijdigheid ten opzichte van het aantal teruggegeven statistieken. Als het commando echter alleen wordt gebruikt om fragmentatie te meten, raden we aan deze WITH FAST optie te gebruiken voor optimale prestaties. Een snelle scan leest niet de blad- of dataniveaupagina's van de index. De WITH FAST optie geldt niet voor een heap.
Beperkingen
DBCC SHOWCONTIG Toont geen gegevens met ntext-, tekst- en afbeeldingsdatatypes . Dit komt doordat tekstindexen die tekst- en afbeeldingsgegevens opslaan niet meer bestaan.
Ook DBCC SHOWCONTIG ondersteunt het sommige nieuwe functies niet. Voorbeeld:
- Als de opgegeven tabel of index gepartitioneerd is,
DBCC SHOWCONTIGwordt alleen de eerste partitie van de opgegeven tabel of index weergegeven. -
DBCC SHOWCONTIGtoont geen rij-overloopopslaginformatie en andere nieuwe off-row datatypen, zoals nvarchar(max),varchar(max), varbinary(max) en xml. - Ruimtelijke indexen worden niet ondersteund door
DBCC SHOWCONTIG.
Alle nieuwe functies worden volledig ondersteund door de dynamische beheerweergave van sys.dm_db_index_physical_stats (Transact-SQL ).
Tabelfragmentatie
DBCC SHOWCONTIG bepaalt of de tabel sterk gefragmenteerd is. Tabelfragmentatie vindt plaats door het proces van datawijzigingen (INSERT, UPDATE en DELETE) die aan de tabel worden uitgevoerd. Omdat deze aanpassingen doorgaans niet gelijk verdeeld zijn over de rijen van de tabel, kan de volledigheid van elke pagina in de loop van de tijd variëren. Voor queries die een deel of de hele tabel scannen, kan dergelijke tabelfragmentatie extra paginalezingen veroorzaken. Dit belemmert het parallelle scannen van gegevens.
Wanneer een index sterk gefragmenteerd is, zijn de volgende opties beschikbaar om fragmentatie te verminderen:
Verwijder en maak een geclusterde index opnieuw.
Het opnieuw aanmaken van een geclusterde index herorganiseert de data en veroorzaakt volledige datapagina's. Het niveau van volledigheid kan worden geconfigureerd met behulp van de optie
FILLFACTORinCREATE INDEX. De nadelen van deze methode zijn dat de index offline is tijdens de drop- of hercreatiecyclus, en dat de bewerking atomair is. Als de indexcreatie wordt onderbroken, wordt de index niet opnieuw aangemaakt.Herschik de bladniveaupagina's van de index in een logische volgorde.
Gebruik
ALTER INDEX...REORGANIZEdeze om de bladbladpagina's van de index in een logische volgorde te herschikken. Omdat deze bewerking online is, is de index beschikbaar wanneer de instructie draait. De operatie is ook onderbreekbaar zonder verlies van voltooid werk. Het nadeel van deze methode is dat de methode minder goed werkt in het herorganiseren van de data als een geclusterde indexdrop- of recreate-operatie.Bouw de index opnieuw op.
Gebruik
ALTER INDEXmetREBUILDom de index opnieuw op te bouwen. Zie ALTER INDEX (Transact-SQL)voor meer informatie.
De gemiddelde bytes gratis per pagina en de gemiddelde paginadichtheid (volledige) statistiek in de resultaatset geven de volheid van indexpagina's aan. Het gemiddelde aantal bytes per paginanummer zou laag moeten zijn en het gemiddelde aantal paginadichtheid (volledig) hoog voor een index die niet veel willekeurige inserts heeft. Het verwijderen en opnieuw aanmaken van een index met de FILLFACTOR opgegeven optie kan de statistieken verbeteren. Ook ALTER INDEX zal een REORGANIZE index worden samengepakt, rekening houdend met de FILLFACTOR, en zal de statistieken verbeteren.
Opmerking
Een index met veel willekeurige inserts en zeer volle pagina's zal een verhoogd aantal paginadelingen hebben. Dit veroorzaakt meer fragmentatie.
Het fragmentatieniveau van een index kan op de volgende manieren worden bepaald:
Door de waarden van Extent Switches en Extents Scanned te vergelijken.
De waarde van Extent Switches moet zo dicht mogelijk bij die van Extents Scanned liggen. Deze verhouding wordt berekend als de Scandichtheidswaarde . Deze waarde moet zo hoog mogelijk zijn en kan worden verbeterd door indexfragmentatie te verminderen.
Opmerking
Deze methode werkt niet als de index meerdere bestanden overspant.
Door Logica-Scanfragmentatie en Extent-Scan-fragmentatiewaarden te begrijpen.
Logische Scanfragmentatie en, in mindere mate, Mate Scanfragmentatiewaarden zijn de beste indicatoren van het fragmentatieniveau van een tabel. Beide waarden moeten zo dicht mogelijk bij nul liggen, hoewel een waarde van 0 tot 10 procent acceptabel kan zijn.
Opmerking
De Extent Scan Fragmentation-waarde zal hoog zijn als de index meerdere bestanden beslaat. Om deze waarden te verlagen, moet je de indexfragmentatie verminderen.
Permissions
De gebruiker moet eigenaar zijn van de tabel, of lid zijn van de sysadmin-vaste serverrol, de db_owner vaste databaserol of de db_ddladmin vaste databaserol.
Voorbeelden
Eén. Fragmentatie-informatie voor een tabel weergeven
Het volgende voorbeeld toont fragmentatie-informatie voor de Employee tabel.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('HumanResources.Employee');
GO
B. Gebruik OBJECT_ID om de tabel-ID en sys.indexes te verkrijgen om de index-ID te verkrijgen
Het volgende voorbeeld gebruikt OBJECT_ID een sys.indexes catalogusweergave om de tabel-ID en index-ID voor de AK_Product_Name index van de Production.Product tabel in de AdventureWorks2025 database te verkrijgen.
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. Toon een verkorte resultaatset voor een tabel
Het volgende voorbeeld geeft een afgekorte resultaatset voor de Product tabel in de AdventureWorks2025 database.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('Production.Product', 1) WITH FAST;
GO
D. Toon de volledige resultaatset voor elke index op elke tabel in een database
Het volgende voorbeeld geeft een volledige tabelresultaatset voor elke index op elke tabel in de AdventureWorks2025 database.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES;
GO
E. Gebruik DBCC SHOWCONTIG en DBCC INDEXDEFRAG om de indexen in een database te defragmenteren
Het volgende voorbeeld toont een eenvoudige manier om alle indexen in een database te defragmenteren die gefragmenteerd is boven een gedeclareerde drempel.
/*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