Dela via


DBCC SHOWCONTIG (Transact-SQL)

gäller för:SQL ServerAzure 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 i CREATE 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 med REBUILD 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

Se även