Megosztás a következőn keresztül:


DBCC SHOWCONTIG (Transact-SQL)

A következőkre vonatkozik:SQL ServerFelügyelt Azure SQL-példány

A megadott tábla vagy nézet adatainak és indexeinek töredezettségadatait jeleníti meg.

Fontos

Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását. Használja inkább a sys.dm_db_index_physical_stats.

: SQL Server 2008 (10.0.x) és újabb verziók

Transact-SQL szintaxis konvenciói

Szintaxis

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

Érvek

table_name | table_id | view_name | view_id

A töredezettség ellenőrzésére szolgáló táblázat vagy nézet. Ha nincs megadva, a rendszer az aktuális adatbázisban lévő összes táblát és indexelt nézetet ellenőrzi. A tábla vagy a nézetazonosító beszerzéséhez használja a OBJECT_ID függvényt.

index_name | index_id

A töredezettség ellenőrzésére szolgáló index. Ha nincs megadva, az utasítás feldolgozza a megadott tábla vagy nézet alapindexét. Az indexazonosító beszerzéséhez használja a sys.indexes katalógusnézetet.

VAL

Megadja a DBCC utasítás által visszaadott információtípus beállításait.

GYORS

Megadja, hogy az index és a kimeneti minimális információ gyors vizsgálatára van-e lehetőség. A gyors vizsgálat nem olvassa be az index levél- vagy adatszintű lapjait.

ALL_INDEXES

Megjeleníti a megadott táblák és nézetek összes indexének eredményét, még akkor is, ha egy adott index van megadva.

TABLERESULTS

Az eredményeket sorhalmazként jeleníti meg, további információkkal.

ALL_LEVELS

Csak a visszamenőleges kompatibilitás érdekében tartható fenn. Még akkor is, ha ALL_LEVELS van megadva, csak az indexlevél vagy a tábla adatszintje lesz feldolgozva.

NO_INFOMSGS

Letiltja a 0 és 10 közötti súlyossági szintű információs üzeneteket.

Eredményhalmazok

Az alábbi táblázat az eredményhalmaz adatait ismerteti.

Statisztikai Leírás
oldalak beolvasott A táblázat vagy az index lapjainak száma.
Beolvasott mértékek A táblában vagy indexben lévő mértékek száma.
mértékváltók A DBCC-utasítás hányszor váltott át egyik mértékről a másikra, miközben az utasítás bejárta a táblázat vagy az index lapjait.
oldal terjedelmének Az oldalláncban lévő oldalak száma terjedelemenként.
Vizsgálat sűrűsége [Legjobb szám: Tényleges szám] Százalék. Ez az arány Legjobb darabszámTényleges darabszám. Ez az érték 100, ha minden egybefüggő; ha ez az érték kisebb, mint 100, akkor van némi töredezettség.

Legjobb szám az ideális számú mértékváltozás, ha minden egybefüggően van összekapcsolva. Tényleges darabszám a mértékek változásainak tényleges száma.
logikai vizsgálat töredezettségének Az index levéloldalainak vizsgálatából visszaadott elavult lapok százalékos aránya. Ez a szám nem vonatkozik a halmokra. A rendelésen kívüli lapok olyan lapok, amelyekhez az indexhez rendelt következő fizikai lap nem az a lap, amelyre a következő lapszámozotte mutató mutat az aktuális levéloldalon.
Terjedelmes vizsgálat töredezettsége Az index levéloldalainak vizsgálata során a sorrenden kívüli mértékek százalékos aránya. Ez a szám nem vonatkozik a halmokra. A rendelésen kívüli terjedelem az, amelynél az index aktuális lapját tartalmazó mérték fizikailag nem a következő mérték az index előző oldalát tartalmazó mérték után.

Megjegyzés: Ez a szám értelmetlen, ha az index több fájlra terjed ki.
Laponkénti szabad bájtok száma A beolvasott lapok szabad bájtjainak átlagos száma. Minél nagyobb a szám, annál kevésbé teljesek a lapok. Az alacsonyabb számok akkor jobbak, ha az index nem sok véletlenszerű beszúrást eredményez. Ezt a számot a sorméret is befolyásolja; a nagy sorméret nagyobb számot okozhat.
Oldalsűrűség (teljes) Átlagos oldalsűrűség százalékban. Ez az érték figyelembe veszi a sorméretet. Ezért az érték pontosabban jelzi, hogy az oldalak mennyire teljesek. Minél nagyobb a százalék, annál jobb.

Ha table_id és FAST van megadva, DBCC SHOWCONTIG egy eredményhalmazt ad vissza, amely csak a következő oszlopokat tartalmazza:

  • oldalak beolvasott
  • mértékváltók
  • vizsgálat sűrűsége [Legjobb darabszám:Tényleges szám]
  • Terjedelmes vizsgálat töredezettsége
  • logikai vizsgálat töredezettségének

Ha TABLERESULTS van megadva, DBCC SHOWCONTIG az alábbi oszlopokat és az előző táblázatban leírt kilenc oszlopot adja vissza.

Statisztikai Leírás
objektumnév A feldolgozott tábla vagy nézet neve.
ObjectId Az objektumnév azonosítója.
IndexName A feldolgozott index neve. NULL érték egy halomhoz.
IndexId Az index azonosítója. 0 egy halomra.
szint Az index szintje. A 0. szint az index levél- vagy adatszintje.

A szint 0 egy halomhoz.
Lapok Az index vagy a teljes halom szintjét alkotó lapok száma.
sorok Az index ezen szintjén található adat- vagy indexrekordok száma. Halom esetén ez az érték a teljes halom adatrekordjainak száma.

Halom esetén előfordulhat, hogy a függvényből visszaadott rekordok száma nem egyezik meg a SELECT COUNT(*) a halomhoz való futtatásával visszaadott sorok számával. Ennek az az oka, hogy egy sor több rekordot is tartalmazhat. Bizonyos frissítési helyzetekben például előfordulhat, hogy egy halomsor egy továbbítási rekordot és egy továbbított rekordot tartalmaz a frissítési művelet eredményeként. Emellett a legtöbb nagy LOB-sor több rekordra van felosztva LOB_DATA tárolóban.
MinimumRecordSize Minimális rekordméret az index vagy a teljes halom ezen szintjén.
MaximumRecordSize Maximális rekordméret az index vagy a teljes halom ezen szintjén.
AverageRecordSize Átlagos rekordméret az index vagy a teljes halom ezen szintjén.
ForwardedRecords Az index vagy a teljes halom ezen szintjén továbbított rekordok száma.
kiterjedések Az index vagy a teljes halom ezen szintjén lévő mértékek száma.
ExtentSwitches A DBCC-utasítás hányszor váltott át egyik mértékről a másikra, miközben az utasítás bejárta a táblázat vagy az index lapjait.
AverageFreeBytes A beolvasott lapok szabad bájtjainak átlagos száma. Minél nagyobb a szám, annál kevésbé teljesek a lapok. Az alacsonyabb számok akkor jobbak, ha az index nem sok véletlenszerű beszúrást eredményez. Ezt a számot a sorméret is befolyásolja; a nagy sorméret nagyobb számot okozhat.
AveragePageDensity Átlagos oldalsűrűség százalékban. Ez az érték figyelembe veszi a sorméretet. Ezért az érték pontosabban jelzi, hogy az oldalak mennyire teljesek. Minél nagyobb a százalék, annál jobb.
ScanDensity Százalék. A BestCount ActualCountaránya. Ez az érték 100, ha minden egybefüggő; ha ez az érték kisebb, mint 100, akkor van némi töredezettség.
BestCount A mértékek ideális száma megváltozik, ha minden egybefüggően van összekapcsolva.
ActualCount A mértékek változásainak tényleges száma.
LogicalFragmentation Az index levéloldalainak vizsgálatából visszaadott elavult lapok százalékos aránya. Ez a szám nem vonatkozik a halmokra. A rendelésen kívüli lapok olyan lapok, amelyekhez az indexhez rendelt következő fizikai lap nem az a lap, amelyre az aktuális levéloldal következő oldal mutatója mutat.
ExtentFragmentation Az index levéloldalainak vizsgálata során a sorrenden kívüli mértékek százalékos aránya. Ez a szám nem vonatkozik a halmokra. A rendelésen kívüli terjedelem az, amelynél az index aktuális lapját tartalmazó mérték fizikailag nem a következő mérték az index előző oldalát tartalmazó mérték után.

Megjegyzés: Ez a szám értelmetlen, ha az index több fájlra terjed ki.

Ha WITH TABLERESULTS és FAST van megadva, az eredményhalmaz ugyanaz, mint WITH TABLERESULTS megadásakor, kivéve, hogy a következő oszlopok null értékűek lesznek:

Sorok Mértékben
MinimumRecordSize AverageFreeBytes
MaximumRecordSize AveragePageDensity
AverageRecordSize ExtentFragmentation
ForwardedRecords

Megjegyzések

A DBCC SHOWCONTIG utasítás bejárja az oldalláncot a megadott index levélszintjén, amikor index_id meg van adva. Ha csak table_id van megadva, vagy ha index_id 0, a megadott tábla adatoldalait ellenőrzi a rendszer. A művelethez csak szándékalapú (IS) táblazárolás szükséges. Így az összes frissítés és beszúrás elvégezhető, kivéve azokat, amelyek kizárólagos (X) táblazárolást igényelnek. Ez lehetővé teszi a végrehajtás sebessége és az egyidejűség csökkentése közötti kompromisszumot a visszaadott statisztikák számával szemben. Ha azonban a parancsot csak a töredezettség mérésére használja, javasoljuk, hogy az optimális teljesítmény érdekében használja a WITH FAST lehetőséget. A gyors vizsgálat nem olvassa be az index levél- vagy adatszintű lapjait. A WITH FAST beállítás nem vonatkozik a halomra.

Korlátozások

DBCC SHOWCONTIG nem jelenít meg adatokat szöveges, szövegesés kép adattípusokkal. Ennek az az oka, hogy a szöveg- és képadatokat tároló szövegindexek már nem léteznek.

Emellett DBCC SHOWCONTIG nem támogat néhány új funkciót. Például:

  • Ha a megadott tábla vagy index particionált, DBCC SHOWCONTIG csak a megadott tábla vagy index első partícióját jeleníti meg.
  • DBCC SHOWCONTIG nem jeleníti meg a sorszintű túlcsordulás tárolási adatait és egyéb új soron kívüli adattípusokat, például nvarchar(max), varchar(max), varbinary(max)és xml.
  • A térbeli indexeket a DBCC SHOWCONTIGnem támogatja.

Az sys.dm_db_index_physical_stats (Transact-SQL) dinamikus felügyeleti nézet minden új funkciót teljes mértékben támogat.

Táblázattöredezettség

DBCC SHOWCONTIG határozza meg, hogy a táblázat erősen töredezett-e. A táblázat töredezettsége a táblán végrehajtott adatmódosítások (INSERT, UPDATE és DELETE) folyamatán keresztül történik. Mivel ezek a módosítások általában nem egyenlően oszlanak el a táblázat sorai között, az egyes lapok teljessége idővel változhat. A táblák egy részét vagy egészét beolvasó lekérdezések esetén az ilyen táblatöredezettség további oldalolvasásokat okozhat. Ez akadályozza az adatok párhuzamos vizsgálatát.

Ha egy index erősen töredezett, az alábbi lehetőségek állnak rendelkezésre a töredezettség csökkentésére:

  • Fürtözött index elvetése és újbóli létrehozása.

    A fürtözött index újbóli létrehozása átrendezi az adatokat, és teljes adatoldalakat okoz. A teljességi szint a FILLFACTORCREATE INDEX lehetőségével konfigurálható. Ennek a módszernek az a hátránya, hogy az index offline állapotban van az elvetési vagy újbóli létrehozási ciklus során, és hogy a művelet atomi. Ha az index létrehozása megszakad, az index nem jön létre újra.

  • Az index levélszintű lapjainak átrendezése logikai sorrendben.

    A ALTER INDEX...REORGANIZE használatával logikai sorrendbe rendezheti az index levélszintű lapjait. Mivel ez a művelet egy online művelet, az index akkor érhető el, amikor az utasítás fut. A művelet a befejezett munka elvesztése nélkül is megszakítható. Ennek a módszernek az a hátránya, hogy a metódus nem olyan jó feladat, mint az adatok fürtözött indexelejtési vagy újra-létrehozási műveletként való átrendezése.

  • Az index újraépítése.

    Az index újraépítéséhez használja ALTER INDEXREBUILD. További információ: ALTER INDEX (Transact-SQL).

Az Avg. Bytes free per page és Avg. Az oldalsűrűség (teljes) statisztika az eredményhalmazban az indexlapok teljességét jelzi. Az oldalonkénti bájtok száma számnak alacsonynak kell lennie, és a Avg. Az oldalsűrűség (teljes) számnak magasnak kell lennie egy olyan indexhez, amely nem rendelkezik sok véletlenszerű beszúrással. A megadott FILLFACTOR beállítással rendelkező index elvetése és újbóli létrehozása javíthatja a statisztikákat. Emellett a ALTER INDEXREORGANIZE indexet tömörít, figyelembe véve annak FILLFACTOR, és javítja a statisztikákat.

Jegyzet

Az olyan indexek, amelyek sok véletlenszerű beszúrást és nagyon teljes oldalt tartalmaznak, nagyobb számú oldaleloszlása lesz. Ez nagyobb töredezettséget okoz.

Az index töredezettségi szintje a következő módokon határozható meg:

  • A Mértékváltók és a Beolvasott mértékekértékeinek összehasonlítása.

    A Mértékváltók értékének a lehető legközelebb kell lennie a beolvasott mértékekértékéhez. Ezt az arányt a vizsgálat sűrűsége értékként számítjuk ki. Ennek az értéknek a lehető legnagyobbnak kell lennie, és az index töredezettségének csökkentésével javítható.

    Jegyzet

    Ez a módszer nem működik, ha az index több fájlra is kiterjed.

  • A logikai vizsgálat töredezettségének és a vizsgálat töredezettségének értékeinek megismerésével.

    logikai vizsgálat töredezettségének, és kisebb mértékben a tábla töredezettségi szintjének legjobb mutatói a mértékvizsgálati töredezettség értékek. Mindkét értéknek a lehető legközelebb kell lennie a nullához, bár egy 0 és 10 százalék közötti érték elfogadható lehet.

    Jegyzet

    A Kiterjedésvizsgálat töredezettsége érték magas lesz, ha az index több fájlra is kiterjed. Az értékek csökkentéséhez csökkentenie kell az index töredezettségét.

Engedélyek

A felhasználónak rendelkeznie kell a táblával, vagy tagja kell lennie a sysadmin rögzített kiszolgálói szerepkörnek, a db_owner rögzített adatbázis-szerepkörnek vagy a db_ddladmin rögzített adatbázis-szerepkörnek.

Példák

Egy. Táblázat töredezettségadatainak megjelenítése

Az alábbi példa a Employee táblára vonatkozó töredezettségadatokat jeleníti meg.

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

B. A OBJECT_ID használatával szerezze be a táblaazonosítót és a sys.indexeket az indexazonosító beszerzéséhez

Az alábbi példa a OBJECT_ID és a sys.indexes katalógusnézetet használja a AK_Product_Name adatbázis Production.Product táblájának AdventureWorks2025 indexéhez tartozó táblaazonosító és indexazonosító lekéréséhez.

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. Tábla rövidített eredményhalmazának megjelenítése

Az alábbi példa a Product adatbázis AdventureWorks2025 táblájának rövidített eredménykészletét adja vissza.

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

D. Az adatbázis minden táblájának összes indexéhez tartozó teljes eredménykészlet megjelenítése

Az alábbi példa egy teljes tábla eredménykészletét adja vissza a AdventureWorks2025 adatbázis minden táblájának összes indexéhez.

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

E. Adatbázis indexeinek töredezettségmentesítése a DBCC SHOWCONTIG és a DBCC INDEXDEFRAG használatával

Az alábbi példa egy egyszerű módszert mutat be egy adatbázis összes indexének töredezettségmentesítésére, amely egy deklarált küszöbérték felett töredezett.

/*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

Lásd még: