Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
Visar fragmenteringsinformation för data och index i den angivna tabellen eller vyn.
Viktig
Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen. Använd sys.dm_db_index_physical_stats i stället.
gäller för: SQL Server 2008 (10.0.x) och senare versioner
Transact-SQL syntaxkonventioner
Syntax
DBCC SHOWCONTIG
[ (
{ table_name | table_id | view_name | view_id }
[ , index_name | index_id ]
) ]
[ WITH
{
[ , [ ALL_INDEXES ] ]
[ , [ TABLERESULTS ] ]
[ , [ FAST ] ]
[ , [ ALL_LEVELS ] ]
[ NO_INFOMSGS ]
}
]
Argument
table_name | table_id | view_name | view_id
Tabellen eller vyn för att söka efter fragmenteringsinformation. Om det inte anges kontrolleras alla tabeller och indexerade vyer i den aktuella databasen. Om du vill hämta tabell- eller vy-ID:t använder du funktionen OBJECT_ID.
index_name | index_id
Indexet för att söka efter fragmenteringsinformation. Om den inte anges bearbetar -instruktionen basindexet för den angivna tabellen eller vyn. Om du vill hämta index-ID:t använder du sys.indexes katalogvy.
MED
Anger alternativ för den typ av information som returneras av DBCC-instruktionen.
SNABB
Anger om du vill utföra en snabb genomsökning av indexet och utdata med minimal information. En snabb genomsökning läser inte indexets löv- eller datanivåsidor.
ALL_INDEXES
Visar resultat för alla index för de angivna tabellerna och vyerna, även om ett visst index har angetts.
TABLERESULTS
Visar resultat som en raduppsättning med ytterligare information.
ALL_LEVELS
Underhålls endast för bakåtkompatibilitet. Även om ALL_LEVELS
anges bearbetas endast indexbladets nivå eller tabelldatanivå.
NO_INFOMSGS
Undertrycker alla informationsmeddelanden som har allvarlighetsgrad mellan 0 och 10.
Resultatuppsättningar
I följande tabell beskrivs informationen i resultatuppsättningen.
Statistik | Beskrivning |
---|---|
sidor genomsöks | Antal sidor i tabellen eller indexet. |
genomsökt | Antal omfattningar i tabellen eller indexet. |
omfångsväxlar | Antal gånger DBCC-instruktionen flyttades från en omfattning till en annan medan instruktionen passerade sidorna i tabellen eller indexet. |
genomsnittssidor per | Antal sidor per omfattning i sidkedjan. |
genomsökningsdensitet [bästa antal: Faktiskt antal] | En procentsats. Det är förhållandet bästa antal till faktiskt antal. Det här värdet är 100 om allt är sammanhängande. Om det här värdet är mindre än 100 finns det viss fragmentering. Bästa antal är det idealiska antalet utsträckningsändringar om allt är sammanhängande länkat. Verkligt antal är det faktiska antalet ändringar i omfattningen. |
fragmentering av logisk genomsökning | Procentandel av out-of-order-sidor som returneras från genomsökning av lövsidorna i ett index. Det här numret är inte relevant för högar. En out-of-order-sida är en sida där nästa fysiska sida som allokeras till indexet inte är den sida som pekas på av nästa sidbrytninge pekare på den aktuella lövsidan. |
fragmentering av omfattningsskanning | Procentandel av out-of-order-omfattningar vid genomsökning av lövsidorna i ett index. Det här numret är inte relevant för högar. En out-of-order-omfattning är en för vilken omfattningen som innehåller den aktuella sidan för ett index inte fysiskt är nästa utsträckning efter den utsträckning som innehåller föregående sida för ett index. Obs! Det här talet är meningslöst när indexet sträcker sig över flera filer. |
Genomsnittligt antal byte kostnadsfritt per sida | Genomsnittligt antal lediga byte på de sidor som genomsöks. Ju större tal, desto mindre full är sidorna. Lägre tal är bättre om indexet inte har många slumpmässiga infogningar. Det här talet påverkas också av radstorleken. en stor radstorlek kan orsaka ett större tal. |
Genomsnittlig sidtäthet (fullständig) | Genomsnittlig sidtäthet i procent. Det här värdet tar hänsyn till radstorleken. Därför är värdet en mer exakt indikation på hur fullständiga dina sidor är. Ju större procentandel desto bättre. |
När table_id och FAST anges returnerar DBCC SHOWCONTIG
en resultatuppsättning med endast följande kolumner:
- sidor genomsöks
- omfångsväxlar
- Genomsökningsdensitet [Bästa antal:Faktiskt antal]
- fragmentering av omfattningsskanning
- fragmentering av logisk genomsökning
När TABLERESULTS
anges returnerar DBCC SHOWCONTIG
följande kolumner och även de nio kolumner som beskrivs i föregående tabell.
Statistik | Beskrivning |
---|---|
objektnamn | Namnet på den bearbetade tabellen eller vyn. |
ObjectId | ID för objektnamnet. |
IndexName | Namnet på det bearbetade indexet. NULL för en heap. |
IndexId | ID för indexet. 0 för en hög. |
nivå | Indexnivå. Nivå 0 är indexets löv- eller datanivå. Nivå är 0 för en hög. |
sidor | Antal sidor som utgör den nivån för indexet eller hela heapen. |
rader | Antal data- eller indexposter på den nivån i indexet. För en heap är det här värdet antalet dataposter i hela heapen. För en heap kanske antalet poster som returneras från den här funktionen inte matchar antalet rader som returneras genom att köra en SELECT COUNT(*) mot heapen. Det beror på att en rad kan innehålla flera poster. I vissa uppdateringssituationer kan till exempel en enskild heap-rad ha en vidarebefordrande post och en vidarebefordrad post som ett resultat av uppdateringsåtgärden. Dessutom delas de flesta stora LOB-rader upp i flera poster i LOB_DATA lagring. |
MinimumRecordSize | Minsta poststorlek på den nivån för indexet eller hela heapen. |
MaximumRecordSize | Maximal poststorlek i den nivån för indexet eller hela heapen. |
AverageRecordSize | Genomsnittlig poststorlek på den nivån för indexet eller hela heapen. |
ForwardedRecords | Antal vidarebefordrade poster på den nivån av indexet eller hela heapen. |
Omfattningar | Antal omfattningar i indexnivån eller hela heapen. |
ExtentSwitches | Antal gånger DBCC-instruktionen flyttades från en omfattning till en annan medan instruktionen passerade sidorna i tabellen eller indexet. |
AverageFreeBytes | Genomsnittligt antal lediga byte på de sidor som genomsöks. Ju större tal, desto mindre full är sidorna. Lägre tal är bättre om indexet inte har många slumpmässiga infogningar. Det här talet påverkas också av radstorleken. en stor radstorlek kan orsaka ett större tal. |
AveragePageDensity | Genomsnittlig sidtäthet i procent. Det här värdet tar hänsyn till radstorleken. Därför är värdet en mer exakt indikation på hur fullständiga dina sidor är. Ju större procentandel desto bättre. |
ScanDensity | En procentsats. Det är förhållandet BestCount till ActualCount. Det här värdet är 100 om allt är sammanhängande. Om det här värdet är mindre än 100 finns det viss fragmentering. |
BestCount | Det ideala antalet omfattningsändringar om allt är sammanhängande länkat. |
ActualCount | Det faktiska antalet omfattningsändringar. |
LogicalFragmentation | Procentandel av out-of-order-sidor som returneras från genomsökning av lövsidorna i ett index. Det här numret är inte relevant för högar. En out-of-order-sida är en sida där nästa fysiska sida som allokeras till indexet inte är den sida som pekas på av nästa sida pekare på den aktuella lövsidan. |
ExtentFragmentation | Procentandel av out-of-order-omfattningar vid genomsökning av lövsidorna i ett index. Det här numret är inte relevant för högar. En out-of-order-omfattning är en för vilken omfattningen som innehåller den aktuella sidan för ett index inte fysiskt är nästa utsträckning efter den utsträckning som innehåller föregående sida för ett index. Obs! Det här talet är meningslöst när indexet sträcker sig över flera filer. |
När WITH TABLERESULTS
och FAST
anges är resultatuppsättningen densamma som när WITH TABLERESULTS
anges, förutom att följande kolumner har null-värden:
Rader | Grader |
---|---|
MinimumRecordSize | AverageFreeBytes |
MaximumRecordSize | AveragePageDensity |
AverageRecordSize | ExtentFragmentation |
ForwardedRecords |
Anmärkningar
Instruktionen DBCC SHOWCONTIG
passerar sidkedjan på lövnivån för det angivna indexet när index_id anges. Om endast table_id anges eller om index_id är 0 genomsöks datasidorna i den angivna tabellen. Åtgärden kräver endast ett is-tabelllås (intent-shared). På så sätt kan alla uppdateringar och infogningar utföras, förutom de som kräver ett exklusivt tabelllås (X). Detta möjliggör en kompromiss mellan körningshastigheten och ingen minskning av samtidigheten mot det antal statistik som returneras. Men om kommandot endast används för att mäta fragmentering rekommenderar vi att du använder alternativet WITH FAST
för optimal prestanda. En snabb genomsökning läser inte indexets löv- eller datanivåsidor. Alternativet WITH FAST
gäller inte för en heap.
Inskränkningar
DBCC SHOWCONTIG
visar inte data med ntext, textoch bild datatyper. Det beror på att textindex som lagrar text- och bilddata inte längre finns.
Dessutom stöder DBCC SHOWCONTIG
inte några nya funktioner. Till exempel:
- Om den angivna tabellen eller indexet är partitionerat visar
DBCC SHOWCONTIG
endast den första partitionen i den angivna tabellen eller indexet. -
DBCC SHOWCONTIG
visar inte lagringsinformation för radöverflöde och andra nya datatyper utanför rad, till exempel nvarchar(max), varchar(max), varbinary(max)och xml-. - Rumsliga index stöds inte av
DBCC SHOWCONTIG
.
Alla nya funktioner stöds fullt ut av sys.dm_db_index_physical_stats (Transact-SQL) dynamisk hanteringsvy.
Tabellfragmentering
DBCC SHOWCONTIG
avgör om tabellen är kraftigt fragmenterad. Tabellfragmentering sker genom processen med dataändringar (INSERT-, UPDATE- och DELETE-instruktioner) som görs mot tabellen. Eftersom dessa ändringar vanligtvis inte fördelas lika mellan raderna i tabellen kan varje sidas fullhet variera över tid. För frågor som genomsöker en del av eller hela en tabell kan sådan tabellfragmentering orsaka ytterligare sidläsningar. Detta hindrar parallell genomsökning av data.
När ett index är kraftigt fragmenterat är följande alternativ tillgängliga för att minska fragmenteringen:
Släpp och återskapa ett grupperat index.
Om du skapar ett grupperat index omorganiseras data och fullständiga datasidor skapas. Fullhetsnivån kan konfigureras med hjälp av alternativet
FILLFACTOR
iCREATE INDEX
. Nackdelarna med den här metoden är att indexet är offline under släpp- eller återskapandecykeln och att åtgärden är atomisk. Om indexskapandet avbryts skapas inte indexet igen.Ändra ordning på bladnivåsidorna i indexet i logisk ordning.
Använd
ALTER INDEX...REORGANIZE
för att ordna om sidorna på lövnivå i indexet i logisk ordning. Eftersom den här åtgärden är en onlineåtgärd är indexet tillgängligt när -instruktionen körs. Åtgärden kan också avbrytas utan förlust av slutfört arbete. Nackdelen med den här metoden är att metoden inte gör ett lika bra jobb med att omorganisera data som en klustrad indexminskning eller återskapandeåtgärd.Återskapa indexet.
Använd
ALTER INDEX
medREBUILD
för att återskapa indexet. Mer information finns i ALTER INDEX (Transact-SQL).
Genomsnittligt antal byte kostnadsfritt per sida och Genomsnittlig sidtäthet (fullständig) statistik i resultatuppsättningen anger indexsidornas fullhet.
Genomsnittligt antal byte per sida talet bör vara lågt och Genomsnittlig sidtäthet (fullständig) talet ska vara högt för ett index som inte har många slumpmässiga infogningar. Om du tar bort och återskapar ett index med det angivna FILLFACTOR
alternativet kan du förbättra statistiken. Dessutom kommer ALTER INDEX
med REORGANIZE
att komprimera ett index, med hänsyn till dess FILLFACTOR
, och förbättra statistiken.
Not
Ett index som har många slumpmässiga infogningar och mycket fullständiga sidor får ett ökat antal siddelningar. Detta orsakar mer fragmentering.
Fragmenteringsnivån för ett index kan fastställas på följande sätt:
Genom att jämföra värdena för Extent Switchs och Extents Scannad.
Värdet för omfångsväxlar ska vara så nära som möjligt för omfattningar som genomsöks. Det här förhållandet beräknas som värdet Genomsökningsdensitet. Det här värdet bör vara så högt som möjligt och kan förbättras genom att minska indexfragmenteringen.
Not
Den här metoden fungerar inte om indexet sträcker sig över flera filer.
Genom att förstå fragmentering av logisk genomsökning och värden.
fragmentering av logisk genomsökning och i mindre utsträckning fragmentering av omfattningsskanning värden är de bästa indikatorerna på fragmenteringsnivån i en tabell. Båda dessa värden bör vara så nära noll som möjligt, även om ett värde från 0 till 10 procent kan vara acceptabelt.
Not
Fragmentering av omfattningsskanning är högt om indexet sträcker sig över flera filer. För att minska dessa värden måste du minska indexfragmenteringen.
Behörigheter
Användaren måste äga tabellen eller vara medlem i sysadmin fast serverroll, db_owner fast databasroll eller db_ddladmin fast databasroll.
Exempel
A. Visa fragmenteringsinformation för en tabell
I följande exempel visas fragmenteringsinformation för tabellen Employee
.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('HumanResources.Employee');
GO
B. Använd OBJECT_ID för att hämta tabell-ID och sys.index för att hämta index-ID:t
I följande exempel används OBJECT_ID
och katalogvyn sys.indexes
för att hämta tabell-ID och index-ID för AK_Product_Name
-indexet för tabellen Production.Product
i AdventureWorks2022
-databasen.
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. Visa en förkortad resultatuppsättning för en tabell
I följande exempel returneras en förkortad resultatuppsättning för tabellen Product
i databasen AdventureWorks2022
.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG ('Production.Product', 1) WITH FAST;
GO
D. Visa den fullständiga resultatuppsättningen för varje index i varje tabell i en databas
I följande exempel returneras en fullständig tabellresultatuppsättning för varje index i varje tabell i AdventureWorks2022
-databasen.
USE AdventureWorks2022;
GO
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES;
GO
E. Använda DBCC SHOWCONTIG och DBCC INDEXDEFRAG för att defragmentera indexen i en databas
I följande exempel visas ett enkelt sätt att defragmentera alla index i en databas som är fragmenterad över ett deklarerat tröskelvärde.
/*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