DBCC INDEXDEFRAG (Transact-SQL)DBCC INDEXDEFRAG (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Defragmentiert Indizes der angegebenen Tabelle oder Sicht.Defragments indexes of the specified table or view.

Wichtig

Dieses Feature wird in einer künftigen Version von Microsoft SQL Server entfernt.This feature will be removed in a future version of Microsoft SQL Server. Verwenden Sie dieses Feature nicht in einer neuen Entwicklungsarbeit, und ändern Sie Anwendungen, die dieses Feature verwenden, so schnell wie möglich.Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible.Verwendung ALTER INDEX stattdessen. Use ALTER INDEX instead.

Gilt für: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 über aktuelle Version)Applies to: SQL ServerSQL Server ( SQL Server 2008SQL Server 2008 through current version)

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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 ]   

ArgumenteArguments

database_name | database_id | 0database_name | database_id | 0
Die Datenbank, die den zu defragmentierenden Index enthält.Is the database containing the index to defragment. Wird 0 angegeben, wird die aktuelle Datenbank verwendet.If 0 is specified, the current database is used. Datenbanknamen müssen den Regeln für entsprechen Bezeichner.Database names must comply with the rules for identifiers.

TABLE_NAME | Table_id | View_name | View_idtable_name | table_id | view_name | view_id
Die Tabelle oder Sicht, die den zu defragmentierenden Index enthält.Is the table or view containing the index to defragment. Tabellen- und Sichtnamen müssen den Regeln für Bezeichner entsprechen.Table and view names must comply with the rules for identifiers.

index_name | index_idindex_name | index_id
Der Name oder die ID für den Index, der defragmentiert werden soll.Is the name or ID of the index to defragment. Falls nicht angegeben, werden von der Anweisung alle Indizes der angegebenen Tabelle oder Sicht defragmentiert.If not specified, the statement defragments all indexes of the specified table or view. Indexnamen müssen den Regeln für Bezeichner entsprechen.Index names must comply with the rules for identifiers.

partition_number | 0partition_number | 0
Die Partitionsnummer des Indexes, der defragmentiert werden soll.Is the partition number of the index to defragment. Falls nichts oder 0 angegeben ist, werden von der Anweisung alle Partitionen im angegebenen Index defragmentiert.If not specified or if 0 is specified, the statement defragments all partitions in the specified index.

WITH NO_INFOMSGSWITH NO_INFOMSGS
Unterdrückt alle Informationsmeldungen mit einem Schweregrad von 0 bis 10.Suppresses all informational messages that have severity levels from 0 through 10.

HinweiseRemarks

DBCC INDEXDEFRAG defragmentiert die Blattebene eines Indexes, sodass die physische Reihenfolge der Seiten mit der logischen Reihenfolge (von links nach rechts) der Blattknoten übereinstimmt. Dadurch wird die Leistung beim Durchsuchen des Indexes verbessert.DBCC INDEXDEFRAG defragments the leaf level of an index so that the physical order of the pages matches the left-to-right logical order of the leaf nodes, therefore improving index-scanning performance.

Hinweis

Wenn DBCC INDEXDEFRAG ausgeführt wird, tritt die Indexdefragmentierung seriell auf.When DBCC INDEXDEFRAG is run, index defragmentation occurs serially. Das bedeutet, dass der Vorgang bei einem einzelnen Index mit einem einzigen Thread ausgeführt wird.This means that the operation on a single index is performed using a single thread. Es tritt keine Parallelität auf.No parallelism occurs. Außerdem werden Vorgänge für mehrere Indizes aus derselben DBCC INDEXDEFRAG-Anweisung nur für jeweils einen Index ausgeführt.Also, operations on multiple indexes from the same DBCC INDEXDEFRAG statement are performed on one index at a time.

DBCC INDEXDEFRAG komprimiert auch die Seiten eines Indexes, wobei auch der beim Erstellen des Indexes angegebene Füllfaktor beachtet wird.DBCC INDEXDEFRAG also compacts the pages of an index, taking into consideration the fill factor specified when the index was created. Alle leeren Seiten, die durch diese Komprimierung erstellt wurden, werden entfernt.Any empty pages created because of this compaction are removed. Weitere Informationen finden Sie unter Angeben des Füllfaktors für einen Index.For more information, see Specify Fill Factor for an Index.

Wenn sich ein Index über mehr als eine Datei erstreckt, defragmentiert DBCC INDEXDEFRAG nur eine Datei zu einem Zeitpunkt.If an index spans more than one file, DBCC INDEXDEFRAG defragments one file at a time. Seiten werden nicht zwischen Dateien verschoben.Pages do not migrate between files.

Alle fünf Minuten sendet DBCC INDEXDEFRAG einen Bericht an den Benutzer mit dem bereits fertig gestellten Prozentsatz.DBCC INDEXDEFRAG reports the estimated percentage completed every five minutes. DBCC INDEXDEFRAG kann an jeder Stelle des Vorgangs beendet werden, wobei der fertig gestellte Anteil erhalten bleibt.DBCC INDEXDEFRAG can be stopped at any point in the process, and any completed work is retained.

Im Gegensatz zu DBCC DBREINDEX (oder der Indexerstellung allgemein) ist DBCC INDEXDEFRAG ein Onlinevorgang.Unlike DBCC DBREINDEX, or the index building operation generally, DBCC INDEXDEFRAG is an online operation. Es werden keine Sperren über längere Zeit errichtet.It does not hold locks long term. Daher blockiert DBCC INDEXDEFRAG keine aktiven Abfragen oder Updates.Therefore, DBCC INDEXDEFRAG does not block running queries or updates. Ein relativ unfragmentierter Index kann schneller defragmentiert werden, als ein neuer Index erstellt werden kann, da die Defragmentierungszeit im Zusammenhang mit der Fragmentierungsebene steht.Because the time to defragment is related to the level of fragmentation, a relatively unfragmented index can be defragmented faster than a new index can be built. Das Defragmentieren eines stark fragmentierten Indexes kann wesentlich länger dauern als das erneute Erstellen.A very fragmented index might take considerably longer to defragment than to rebuild.

Die Defragmentierung wird immer vollständig protokolliert, unabhängig von der Einstellung des Datenbank-Wiederherstellungsmodells.The defragmentation is always fully logged, regardless of the database recovery model setting. Weitere Informationen zu dieser Einstellung finden Sie unter ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE (Transact-SQL). Bei der Defragmentierung eines stark fragmentierten Indexes werden möglicherweise mehr Protokolleinträge erstellt als bei der Indexerstellung mit vollständiger Protokollierung.The defragmentation of a very fragmented index can generate more log than a fully logged index creation. Die Defragmentierung wird jedoch als eine Reihe von kurzen Transaktionen ausgeführt und benötigt somit kein großes Protokoll, wenn häufig eine Protokollsicherung durchgeführt wird oder SIMPLE als Einstellung für das Wiederherstellungsmodell festgelegt ist.However, the defragmentation is performed as a series of short transactions, so a large log is unnecessary if log backups are taken frequently or if the recovery model setting is SIMPLE.

EinschränkungenRestrictions

DBCC INDEXDEFRAG verschiebt Indexblattseiten an andere Stellen.DBCC INDEXDEFRAG shuffles index leaf pages in place. Daher führt das Ausführen von DBCC INDEXDEFRAG für einen Index, der mit anderen Indizes auf dem Datenträger verzahnt ist, nicht dazu, dass die Blattseiten im Index zusammenhängen.Therefore, if an index is interleaved with other indexes on disk, running DBCC INDEXDEFRAG against that index does not make all leaf pages in the index contiguous. Erstellen Sie den Index neu, um das Gruppieren von Seiten zu verbessern.To improve the clustering of pages, rebuild the index. DBCC INDEXDEFRAG kann nicht verwendet werden, um die folgenden Indizes zu defragmentieren:DBCC INDEXDEFRAG cannot be used to defragment the following indexes:

  • Ein deaktivierter Index.A disabled index.
  • Indizes, für die für das Seitensperren die Einstellung OFF festgelegt ist.An index with page locking set to OFF.
  • Räumliche IndizesA spatial index.

Die Verwendung von DBCC INDEXDEFRAG bei Systemtabellen wird nicht unterstützt.DBCC INDEXDEFRAG is not supported for use on system tables.

ResultsetsResult Sets

DBCC INDEXDEFRAG gibt das folgende Resultset zurück (die Werte können abweichen), wenn ein Index in der Anweisung angegeben ist (sofern nicht WITH NO_INFOMSGS angegeben ist):DBCC INDEXDEFRAG returns the following result set (values may vary) if an index is specified in the statement (unless WITH NO_INFOMSGS is specified):

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.  

BerechtigungenPermissions

Bei dem Aufrufer muss es sich um den Besitzer der Tabelle oder um ein Mitglied der festen Serverrolle sysadmin , der festen Datenbankrolle db_owner oder der festen Datenbankrolle db_ddladmin handeln.Caller must own the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

BeispieleExamples

A.A. Defragmentieren eines Indexes mit DBCC INDEXDEFRAGUsing DBCC INDEXDEFRAG to defragment an index

Im folgende Beispiel werden alle Partitionen des defragmentiert die PK_Product_ProductID index in der Production.Product -Tabelle in der AdventureWorks Datenbank.The following example defragments all partitions of the PK_Product_ProductID index in the Production.Product table in the AdventureWorks database.

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

B.B. Mit DBCC SHOWCONTIG und DBCC INDEXDEFRAG die Indizes in einer Datenbank defragmentierenUsing DBCC SHOWCONTIG and DBCC INDEXDEFRAG to defragment the indexes in a database

Das folgende Beispiel zeigt eine einfache Möglichkeit, alle Indizes in einer Datenbank, deren Fragmentierung einen deklarierten Schwellenwert überschreitet, zu defragmentieren.The following example shows a simple way to defragment all indexes in a database that are fragmented above a declared threshold.

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

Siehe auchSee Also

DBCC (Transact-SQL)DBCC (Transact-SQL)
sys.dm_db_index_physical_stats (Transact-SQL)sys.dm_db_index_physical_stats (Transact-SQL)
CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
ALTER INDEX (Transact-SQL)ALTER INDEX (Transact-SQL)