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


DBCC INDEXDEFRAG (Transact-SQL)

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

A megadott tábla vagy nézet töredezettségmentesítési indexei.

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. Ehelyett használja ALTER INDEX.

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

Transact-SQL szintaxis konvenciói

Szintaxis

DBCC INDEXDEFRAG
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
    [ WITH NO_INFOMSGS ]

Érvek

| database_namedatabase_id | 0

A töredezettségmentesség indexét tartalmazó adatbázis. Ha 0 van megadva, a rendszer az aktuális adatbázist használja. Az adatbázisneveknek meg kell felelniük azonosítókszabályainak.

table_name | table_id | view_name | view_id

A töredezettségmentesítéshez használt indexet tartalmazó táblázat vagy nézet. A tábla- és nézetneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.

index_name | index_id

A töredezettségmentesítéshez használt index neve vagy azonosítója. Ha nincs megadva, az utasítás töredezettségmentesen töredezett a megadott tábla vagy nézet összes indexében. Az indexneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.

partition_number | 0

A töredezettségmentesítéshez használt index partíciószáma. Ha nincs megadva, vagy ha 0 van megadva, az utasítás töredezettségmentesítést alkalmaz a megadott index összes partícióján.

A NO_INFOMSGS

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

Megjegyzések

DBCC INDEXDEFRAG töredezettségmentesítéssel az index levélszintje úgy, hogy a lapok fizikai sorrendje megegyezik a levélcsomópontok balról jobbra logikai sorrendjével, ezáltal javítva az indexvizsgálat teljesítményét.

Jegyzet

Ha DBCC INDEXDEFRAG fut, az index töredezettségmentesítése sorozatosan történik. Ez azt jelenti, hogy a művelet egyetlen indexen egyetlen szál használatával történik. Nincs párhuzamosság. Emellett az ugyanazon DBCC INDEXDEFRAG utasításból származó több indexen végzett műveletek egyszerre egy indexen lesznek végrehajtva.

DBCC INDEXDEFRAG az index lapjait is tömöríti, figyelembe véve az index létrehozásakor megadott kitöltési tényezőt. A tömörítés miatt létrehozott üres lapok törlődnek. További információ: Kitöltési tényező megadása index.

Ha egy index egynél több fájlra terjed ki, DBCC INDEXDEFRAG egyszerre egy fájlt töredezettségmentesít. A lapok nem migrálnak a fájlok között.

DBCC INDEXDEFRAG a becsült százalékos készültségi arányt öt percenként jelenti. DBCC INDEXDEFRAG a folyamat bármely pontján leállítható, és a befejezett munka megmarad.

A DBCC DBREINDEXvagy általában az indexépítési művelettel ellentétben a DBCC INDEXDEFRAG egy online művelet. Nem tart hosszú távú zárakat. Ezért DBCC INDEXDEFRAG nem blokkolja a lekérdezések vagy frissítések futtatását. Mivel a töredezettségmentesítés ideje a töredezettség szintjéhez kapcsolódik, egy viszonylag töredezett index gyorsabban töredezett, mint egy új index felépíthető. A erősen töredezett indexek töredezettsége jelentősen tovább tarthat, mint az újraépítés.

A töredezettségmentesítés mindig teljes mértékben naplózva van, függetlenül az adatbázis-helyreállítási modell beállításától. További információ: ALTER DATABASE (Transact-SQL). Egy erősen töredezett index töredezettsége több naplót hozhat létre, mint egy teljesen naplózott index létrehozása. A töredezettségmentesítés azonban rövid tranzakciók sorozataként történik, így a nagy méretű naplók szükségtelenek, ha gyakran készít biztonsági másolatot a naplókról, vagy ha a helyreállítási modell beállítása EGYSZERŰ.

Korlátozások

DBCC INDEXDEFRAG sorba rendezi az index levéloldalait. Ezért ha egy index más lemezen lévő indexekkel van összekötve, akkor az indexen futó DBCC INDEXDEFRAG nem teszi egybe az index összes levéloldalát. A lapok fürtözésének javítása érdekében építse újra az indexet.

DBCC INDEXDEFRAG nem használható a következő indexek töredezettségmentesítésére:

  • Letiltott index.
  • Egy index, amelyen az oldalzárolás KI értékre van állítva.
  • Térbeli index.

DBCC INDEXDEFRAG nem támogatott a rendszertáblákon való használathoz.

Eredményhalmazok

DBCC INDEXDEFRAG a következő eredményhalmazt adja vissza (az értékek eltérhetnek), ha az utasításban index van megadva (kivéve, ha WITH NO_INFOMSGS van megadva):

Pages Scanned Pages Moved Pages Removed
------------- ----------- -------------
359           346         8
  
(1 row(s) affected)
  
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Engedélyek

A hívó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. Index töredezettségmentesítése a DBCC INDEXDEFRAG használatával

Az alábbi példa a PK_Product_ProductID-index összes partícióját töredezettségmentesen töredezi az Production.Product-adatbázis AdventureWorks2025 táblájában.

DBCC INDEXDEFRAG (AdventureWorks2022, 'Production.Product', PK_Product_ProductID);
GO

B. 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: