Auflösen der Indexfragmentierung durch Neuorganisieren oder Neuerstellen von IndizesResolve index fragmentation by reorganizing or rebuilding indexes

GILT FÜR: JaSQL Server JaAzure SQL-Datenbank JaAzure Synapse Analytics (SQL Data Warehouse) JaParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL Data Warehouse) YesParallel Data Warehouse

In diesem Artikel wird beschrieben, wie die Indexdefragmentierung durchgeführt wird und welche Auswirkungen dies auf die Abfrageleistung hat.This article describes how index defragmentation occurs and discusses its impact on query performance. Nachdem Sie den Umfang der Fragmentierung ermittelt haben, die für einen Index festgelegt wurde, können Sie einen Index entweder durch Neuorganisieren oder durch Neuerstellen defragmentieren, indem Sie Transact-SQL-Befehle im Tool Ihrer Wahl ausführen oder SQL Server Management Studio verwenden.Once you determine the amount of fragmentation that exists for an index, you can defragment an index by either reorganizing an index or rebuilding an index by running Transact-SQL commands in your tool of choice or by using SQL Server Management Studio.

Überblick über die IndexfragmentierungIndex fragmentation overview

Unten finden Sie Erklärungen, um was es sich bei der Indexfragmentierung handelt, und warum sie relevant ist:What is index fragmentation and why should I care about it:

  • Fragmentierung liegt vor, wenn Indizes über Seiten verfügen, bei denen die logische Reihenfolge innerhalb des Index basierend auf dem Schlüsselwert des Index nicht der physischen Reihenfolge der Indexseiten entspricht.Fragmentation exists when indexes have pages in which the logical ordering within the index, based on the key value of the index, does not match the physical ordering inside the index pages.
  • Datenbank-EngineDatabase Engine verwaltet Indizes automatisch, wenn Einfüge-, Update- oder Löschvorgänge an den zugrunde liegenden Daten vorgenommen werden.The Datenbank-EngineDatabase Engine automatically modifies indexes whenever insert, update, or delete operations are made to the underlying data. Das Hinzufügen von Zeilen in einer Tabelle kann beispielsweise dazu führen, das im Rowstore-Index vorhandene Seiten aufgeteilt werden, um Platz für das Einfügen neuer Schlüsselwerte zu machen.For example, the addition of rows in a table may cause existing pages in rowstore indexes to split to make room for the insertion of new key values. Im Lauf der Zeit können diese Änderungen dazu führen, dass die Informationen im Index in der Datenbank verstreut (fragmentiert) werden.Over time these modifications can cause the information in the index to become scattered in the database (fragmented). Fragmentierung liegt vor, wenn Indizes über Seiten verfügen, in denen die logische Reihenfolge (basierend auf dem Schlüsselwert) nicht der physischen Reihenfolge in der Datendatei entspricht.Fragmentation exists when indexes have pages in which the logical ordering, based on the key value, does not match the physical ordering inside the data file.
  • Stark fragmentierte Indizes können die Abfrageleistung herabsetzen, da zusätzliche E/A-Vorgänge erforderlich sind, um nach Daten zu suchen, auf die der Index verweist.Heavily fragmented indexes can degrade query performance because additional I/O is required to locate data to which the index points. Zusätzliche E/A-Vorgänge führen dazu, dass Ihre Anwendung langsam reagiert, besonders wenn Scanvorgänge beteiligt sind.More I/O causes your application to respond slowly, especially when scan operations are involved.

Erkennen des Umfangs der FragmentierungDetecting the amount of fragmentation

Der erste Schritt bei der Entscheidung für eine Indexdefragmentierungsmethode besteht im Analysieren des Index, um den Fragmentierungsgrad zu ermitteln.The first step in deciding which index defragmentation method to use is to analyze the index to determine the degree of fragmentation. Die Ermittlung von Rowstore-Indizes unterscheidet sich von der von Columnstore-Indizes.You detect fragmentation differently for rowstore indexes and columnstore indexes.

Hinweis

Es ist besonders wichtig, die Index- oder Heapfragmentierung zu überprüfen, nachdem große Datenmengen gelöscht wurden.It's especially important to review index or heap fragmentation after large amounts of data are deleted. Wenn häufig Updates durchgeführt werden, ist es bei Heaps möglicherweise auch erforderlich, die Fragmentierung zu überprüfen, um ein Ansteigen der Anzahl von weiterleitenden Datensätzen zu vermeiden.For heaps, if there are frequent updates, it may also be needed to review fragmentation to avoid proliferation of forwarding records. Weitere Informationen zu Heaps finden Sie unter Heaps (Tabellen ohne gruppierte Indizes).For more information about heaps, see Heaps (Tables without Clustered Indexes).

Erkennen der Fragmentierung von Rowstore-IndizesDetecting fragmentation of rowstore indexes

Mithilfe von sys.dm_db_index_physical_stats können Sie die Fragmentierung in einem bestimmten Index, allen Indizes in einer Tabelle oder indizierten Sicht, allen Indizes in einer Datenbank oder allen Indizes in allen Datenbanken erkennen.By using sys.dm_db_index_physical_stats, you can detect fragmentation in a specific index, all indexes on a table or indexed view, all indexes in a database, or all indexes in all databases. Für partitionierte Indizes stellt sys.dm_db_index_physical_stats außerdem Fragmentierungsinformationen für jede Partition bereit.For partitioned indexes, sys.dm_db_index_physical_stats also provides fragmentation information for each partition.

Das durch sys.dm_db_index_physical_stats zurückgegebene Resultset umfasst die folgenden Spalten:The result set returned by sys.dm_db_index_physical_stats includes the following columns:

ColumnColumn BESCHREIBUNGDescription
avg_fragmentation_in_percentavg_fragmentation_in_percent Der Prozentsatz der logischen Fragmentierung (falsche Reihenfolge der Seiten in einem Index).The percent of logical fragmentation (out-of-order pages in the index).
fragment_countfragment_count Die Anzahl der Fragmente (physisch aufeinanderfolgende Blattseiten) im Index.The number of fragments (physically consecutive leaf pages) in the index.
avg_fragment_size_in_pagesavg_fragment_size_in_pages Durchschnittliche Anzahl der Seiten in einem Fragment in einem Index.Average number of pages in one fragment in an index.

Nachdem der Grad der Fragmentierung bekannt ist, verwenden Sie die folgende Tabelle, um die beste Methode zum Entfernen der Fragmentierung zu ermitteln: INDEX REORGANIZE oder INDEX.After the degree of fragmentation is known, use the following table to determine the best method to remove the fragmentation: INDEX REORGANIZE or INDEX.

avg_fragmentation_in_percent -Wertavg_fragmentation_in_percent value Korrigierende AnweisungCorrective statement
> 5 % und < = 30 % 1> 5% and < = 30% 1 ALTER INDEX REORGANIZEALTER INDEX REORGANIZE
> 30 % 1> 30% 1 ALTER INDEX REBUILD WITH (ONLINE = ON) 2ALTER INDEX REBUILD WITH (ONLINE = ON) 2

1 Diese Werte dienen als grobe Richtlinie, um den Punkt zu bestimmen, an dem Sie zwischen ALTER INDEX REORGANIZE und ALTER INDEX REBUILD wechseln sollten.1 These values provide a rough guideline for determining the point at which you should switch between ALTER INDEX REORGANIZE and ALTER INDEX REBUILD. Die Istwerte können jedoch von Fall zu Fall unterschiedlich sein.However, the actual values may vary from case to case. Es ist wichtig, dass Sie experimentieren, um den besten Schwellenwert für Ihre Umgebung zu bestimmen.It is important that you experiment to determine the best threshold for your environment.

Tipp

Wird ein bestimmter Index beispielsweise hauptsächlich für Überprüfungsvorgänge verwendet, kann ein Entfernen der Fragmentierung die Leistung dieser Vorgänge verbessern.For example, if a given index is used mainly for scan operations, removing fragmentation can improve performance of these operations. Bei Indizes, die in erster Linie für Suchvorgänge verwendet werden, fällt der Leistungsvorteil möglicherweise nicht auf.The performance benefit may not be noticeable for indexes that are used primarily for seek operations.
Ähnliches gilt für das Entfernen der Fragmentierung in einem Heap (einer Tabelle ohne gruppierten Index). Auch dies ist besonders nützlich für Überprüfungsvorgänge für nicht gruppierte Indizes, wirkt sich aber kaum auf Suchvorgänge aus.Similarly, removing fragmentation in a heap (a table with no clustered index) is especially useful for nonclustered index scan operations, but has little effect in lookup operations.

2 Das Neuerstellen eines Indexes kann online oder offline erfolgen.2 Rebuilding an index can be executed online or offline. Das Neuorganisieren eines Indexes erfolgt immer online.Reorganizing an index is always executed online. Damit eine Verfügbarkeit ähnlich der Neuorganisierungsoption erreicht wird, sollten Indizes online neu erstellt werden.To achieve availability similar to the reorganize option, you should rebuild indexes online. Weitere Informationen finden Sie unter Neuerstellen eines Indexes und Ausführen von Onlineindexvorgängen.For more information, see INDEX and Perform Index Operations Online.

Indizes mit einer Fragmentierung oder einem Fragmentierungsgrad unter fünf Prozent müssen nicht defragmentiert werden, da die Vorteile des Entfernens eines so geringen Umfangs der Fragmentierung die CPU-Kosten für das Neuorganisieren und Neuerstellen des Indexes nicht aufwiegen.Indexes with fragmentation or less than 5 percent do not need to be defragmented because the benefit from removing such a small amount of fragmentation is almost always vastly outweighed by the CPU cost incurred to reorganize or rebuild the index. Außerdem wird durch das Neuerstellen oder Neuorganisieren kleiner Rowstore-Indizes die tatsächliche Fragmentierung häufig nicht verringert.Also, rebuilding or reorganizing small rowstore indexes generally does not reduce actually fragmentation. Bis einschließlich SQL Server 2014 (12.x)SQL Server 2014 (12.x) ordnet die SQL Server-Datenbank-EngineSQL Server Database Engine Speicherplatz mithilfe von gemischten Blöcken zu.Up to, and including, SQL Server 2014 (12.x)SQL Server 2014 (12.x), the SQL Server-Datenbank-EngineSQL Server Database Engine allocates space using mixed extents. Daher werden die Seiten kleiner Indizes manchmal in gemischten Blöcken gespeichert.Therefore, pages of small indexes are sometimes stored on mixed extents. Da gemischte Blöcke von bis zu acht Objekten gemeinsam genutzt werden, lässt sich die Fragmentierung in einem kleinen Index durch die erneute Erstellung oder Organisation des Indexes möglicherweise nicht verringern.Mixed extents are shared by up to eight objects, so the fragmentation in a small index might not be reduced after reorganizing or rebuilding it. Weitere Informationen finden Sie unter Überlegungen zur Neuerstellung eines Rowstore-Index.See also Considerations specific to rebuilding rowstore indexes. Weitere Informationen zu Blöcken finden Sie im Handbuch zur Architektur von Seiten und Blöcken.For more information about extents, see the Pages and Extents Architecture Guide.

Erkennen einer Fragmentierung von Columnstore-IndizesDetecting fragmentation of columnstore indexes

Durch die Verwendung von sys.dm_db_column_store_row_group_physical_stats können Sie den Prozentsatz der gelöschten Zeilen in einem Index ermitteln, der ein gutes Maß für die Fragmentierung in einer Zeilengruppe in einem Columnstore-Index darstellt.By using sys.dm_db_column_store_row_group_physical_stats, you can determine the percentage of deleted rows in an index, which is a reasonable measure for fragmentation in a rowgroup of a columnstore index. Verwenden Sie diese Informationen, um die Fragmentierung in einem bestimmten Index, für alle Indizes in einer Tabelle, für alle Indizes in einer Datenbank oder für alle Indizes in sämtlichen Datenbanken zu berechnen.Use this information to compute the fragmentation in a specific index, all indexes on a table, all indexes in a database, or all indexes in all databases.

Das durch sys.dm_db_column_store_row_group_physical_stats zurückgegebene Resultset umfasst die folgenden Spalten:The result set returned by sys.dm_db_column_store_row_group_physical_stats includes the following columns:

ColumnColumn BESCHREIBUNGDescription
total_rowstotal_rows Die Anzahl von Zeilen, die in der Zeilengruppe physisch gespeichert sind.Number of rows physical stored in the row group. Für komprimierte Zeilengruppen schließt dies die Zeilen ein, die als gelöscht markiert sind.For compressed row groups, this includes the rows that are marked as deleted.
deleted_rowsdeleted_rows Die Anzahl von Zeilen, die in einer komprimierten Zeilengruppe physisch gespeichert und zum Löschen markiert sind.Number of rows physically stored in a compressed row group that are marked for deletion. Für Zeilengruppen im Deltastore lautet der Wert 0.0 for row groups that are in the delta store.

Verwenden Sie diese zurückgegeben Informationen, um die Indexfragmentierung mithilfe dieser Formel zu berechnen:Use this information returned to compute index fragmentation using this formula:

100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)

Nachdem der Grad der Indexfragmentierung bekannt ist, verwenden Sie die folgende Tabelle, um die beste Methode zum Entfernen der Fragmentierung zu ermitteln: INDEX REORGANIZE oder INDEX.After the degree of index fragmentation is known, use the following table to determine the best method to remove the fragmentation: INDEX REORGANIZE or INDEX.

Berechnete Fragmentierung als Prozentwertcomputed fragmentation in percent value Gilt für VersionApplies to version Korrigierende AnweisungCorrective statement
> = 20 %> = 20% SQL Server 2012 (11.x)SQL Server 2012 (11.x) und SQL Server 2014 (12.x)SQL Server 2014 (12.x)and SQL Server 2014 (12.x)SQL Server 2014 (12.x) ALTER INDEX REBUILDALTER INDEX REBUILD
> = 20 %> = 20% Seit SQL Server 2016 (13.x)SQL Server 2016 (13.x)Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) ALTER INDEX REORGANIZEALTER INDEX REORGANIZE

Überprüfen der Fragmentierung eines Rowstore-Indexes mit Transact-SQLTransact-SQLTo check the fragmentation of a rowstore index using Transact-SQLTransact-SQL

Das folgende Beispiel ermittelt den durchschnittlichen Prozentsatz der Fragmentierung aller Indizes der Tabelle „HumanResources.Employee“ in der AdventureWorks2016-Datenbank.The following example finds the average fragmentation percentage of all indexes in the HumanResources.Employee table in the AdventureWorks2016 database.

SELECT a.object_id, object_name(a.object_id) AS TableName,
    a.index_id, name AS IndedxName, avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats
    (DB_ID (N'AdventureWorks2016_EXT')
        , OBJECT_ID(N'HumanResources.Employee')
        , NULL
        , NULL
        , NULL) AS a
INNER JOIN sys.indexes AS b
    ON a.object_id = b.object_id
    AND a.index_id = b.index_id;
GO

Das von der vorherigen Anweisung zurückgegebene Resultset kann in etwa wie folgt aussehen.The previous statement returns a result set similar to the following.

object_id   TableName    index_id    IndexName                                             avg_fragmentation_in_percent
----------- ------------ ----------- ----------------------------------------------------- ------------------------------
1557580587  Employee     1           PK_Employee_BusinessEntityID                          0
1557580587  Employee     2           IX_Employee_OrganizationalNode                        0
1557580587  Employee     3           IX_Employee_OrganizationalLevel_OrganizationalNode    0
1557580587  Employee     5           AK_Employee_LoginID                                   66.6666666666667
1557580587  Employee     6           AK_Employee_NationalIDNumber                          50
1557580587  Employee     7           AK_Employee_rowguid                                   0

(6 row(s) affected)

Weitere Informationen finden Sie unter sys.dm_db_index_physical_stats.For more information, see sys.dm_db_index_physical_stats.

Überprüfen der Fragmentierung eines Columnstore-Indexes mit Transact-SQLTransact-SQLTo check the fragmentation of a columnstore index using Transact-SQLTransact-SQL

Das folgende Beispiel ermittelt den durchschnittlichen Prozentsatz der Fragmentierung aller Indizes der Tabelle „dbo.FactResellerSalesXL_CCI“ in der AdventureWorksDW2016-Datenbank.The following example finds the average fragmentation percentage of all indexes in the dbo.FactResellerSalesXL_CCI table in the AdventureWorksDW2016 database.

SELECT i.object_id,
    object_name(i.object_id) AS TableName,
    i.index_id,
    i.name AS IndexName,
    100*(ISNULL(SUM(CSRowGroups.deleted_rows),0))/NULLIF(SUM(CSRowGroups.total_rows),0) AS 'Fragmentation'
FROM sys.indexes AS i  
INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS CSRowGroups
    ON i.object_id = CSRowGroups.object_id
    AND i.index_id = CSRowGroups.index_id
WHERE object_name(i.object_id) = 'FactResellerSalesXL_CCI'
GROUP BY i.object_id, i.index_id, i.name
ORDER BY object_name(i.object_id), i.name;

Das von der vorherigen Anweisung zurückgegebene Resultset kann in etwa wie folgt aussehen.The previous statement returns a result set similar to the following.

object_id   TableName                   index_id    IndexName                       Fragmentation
----------- --------------------------- ----------- ------------------------------- ---------------
114099447   FactResellerSalesXL_CCI     1           IndFactResellerSalesXL_CCI      0

(1 row(s) affected)

Überprüfen der Indexfragmentierung mithilfe von SQL Server Management StudioCheck index fragmentation using SQL Server Management Studio

Hinweis

Management StudioManagement Studio kann nicht zum Berechnen der Fragmentierung von Columnstore-Indizes in SQL Server und nicht zum Berechnen der Fragmentierung von Indizes in Azure SQL-Datenbank verwendet werden.cannot be used to compute fragmentation of columnstore indexes in SQL Server and cannot be used to compute fragmentation of any indexes in Azure SQL Database. Verwenden Sie das vorangehende Transact-SQLTransact-SQL-Beispiel für diese Szenarios.Use the preceding Transact-SQLTransact-SQL example for these scenarios.

  1. Erweitern Sie im Objekt-Explorer die Datenbank mit der Tabelle, in der Sie die Fragmentierung eines Indexes überprüfen möchten.In Object Explorer, Expand the database that contains the table on which you want to check an index's fragmentation.
  2. Erweitern Sie den Ordner Tabellen .Expand the Tables folder.
  3. Erweitern Sie die Tabelle, in der Sie die Fragmentierung eines Indexes überprüfen möchten.Expand the table on which you want to check an index's fragmentation.
  4. Erweitern Sie den Ordner Indizes .Expand the Indexes folder.
  5. Klicken Sie mit der rechten Maustaste auf den Index, für den Sie die Fragmentierung überprüfen möchten, und wählen Sie Eigenschaftenaus.Right-click the index of which you want to check the fragmentation and select Properties.
  6. Wählen Sie unter Seite auswählendie Option Fragmentierungaus.Under Select a page, select Fragmentation.

Die folgenden Informationen sind auf der Seite Fragmentierung verfügbar:The following information is available on the Fragmentation page:

WertValue BESCHREIBUNGDescription
SeitenfüllgradPage fullness Gibt den durchschnittlichen Füllgrad der Indexseiten als Prozentwert an.Indicates average fullness of the index pages, as a percentage. 100 % bedeutet, dass die Indexseiten vollständig gefüllt sind.100% means the index pages are completely full. 50 % heißt, dass jede Indexseite im Durchschnitt zur Hälfte gefüllt ist.50% means that, on average, each index page is half full.
Fragmentierung gesamtTotal fragmentation Prozentwert der logischen Fragmentierung.The logical fragmentation percentage. Dieser Wert gibt die Anzahl der Seiten in einem Index an, die nicht in Reihenfolge gespeichert sind.This indicates the number of pages in an index that are not stored in order.
Durchschnittliche ZeilengrößeAverage row size Die durchschnittliche Größe einer Zeile auf Blattebene.The average size of a leaf-level row.
TiefeDepth Die Anzahl von Ebenen im Index, einschließlich der Blattebene.The number of levels in the index, including the leaf-level.
Weitergeleitete DatensätzeForwarded records Anzahl der Datensätze in einem Heap, die Weiterleitungszeiger auf einen anderen Datenspeicherort besitzen.The number of records in a heap that have forward pointers to another data location. (Dieser Status tritt während eines Updates auf, wenn nicht genügend Speicherplatz vorhanden ist, um die neue Zeile am ursprünglichen Speicherort zu speichern.)(This state occurs during an update, when there is not enough room to store the new row in the original location.)
Inaktive ZeilenGhost rows Anzahl der Zeilen, die als gelöscht markiert sind, aber noch nicht entfernt wurden.The number of rows that are marked as deleted but not yet removed. Diese Zeilen werden von einem Bereinigungsthread entfernt, wenn der Server nicht ausgelastet ist.These rows will be removed by a clean-up thread, when the server is not busy. Dieser Wert schließt keine Zeilen ein, die aufgrund einer ausstehenden Momentaufnahme-Isolationstransaktion beibehalten werden.This value does not include rows that are being retained due to an outstanding snapshot isolation transaction.
IndextypIndex type Der Indextyp.The type of index. Mögliche Werte sind Gruppierter Index, Nicht gruppierter Indexund Primär-XML.Possible values are Clustered index, Nonclustered index, and Primary XML. Tabellen können auch als Heap gespeichert werden (ohne Indizes). Dann kann aber diese Seite Indexeigenschaften nicht geöffnet werden.Tables can also be stored as a heap (without indexes), but then this Index Properties page cannot be opened.
Zeilen auf BlattebeneLeaf-level rows Die Anzahl von Zeilen auf Blattebene.The number of leaf-level rows.
Maximale ZeilengrößeMaximum row size Maximale Größe von Zeilen auf Blattebene.The maximum leaf-level row size.
Minimale ZeilengrößeMinimum row size Minimale Größe von Zeilen auf Blattebene.The minimum leaf-level row size.
SeitenPages Gesamtanzahl der Datenseiten.The total number of data pages.
Partitions-IDPartition ID Partitions-ID der B-Struktur, die den Index enthält.The partition ID of the b-tree containing the index.
Inaktive Zeilen (Version)Version ghost rows Die Anzahl inaktiver Datensätze, die aufgrund einer ausstehenden Momentaufnahme-Isolationstransaktion beibehalten werden.The number of ghost records that are being retained due to an outstanding snapshot isolation transaction.

Defragmentieren von Indizes durch Neuerstellen oder Neuorganisieren des IndexesDefragmenting indexes by rebuilding or reorganizing the index

Sie können einen fragmentierten Index mit einer der folgenden Methoden defragmentieren:You defragment a fragmented index by using one of the following methods:

  • Neuorganisation des IndexesIndex reorganization
  • Neuerstellen des IndexesIndex rebuild

Hinweis

Für partitionierte Indizes, die auf Grundlage eines Partitionsschemas erstellt wurden, können beide der folgenden Methoden für einen vollständigen Index oder für eine einzelne Partition eines Index verwendet werden.For partitioned indexes built on a partition scheme, you can use either of the following methods on a complete index or a single partition of an index.

Neuorganisieren eines IndexReorganize an index

Das Neuorganisieren eines Index beansprucht minimale Systemressourcen und ist ein Vorgang, der online ausgeführt wird.Reorganizing an index uses minimal system resources and is an online operation. Dies bedeutet, dass keine blockierende Langzeitsperren für Tabellen aufrechterhalten werden und dass während der ALTER INDEX REORGANIZE-Transaktion Abfragen oder Updates der zugrunde liegenden Tabelle fortgesetzt werden können.This means long-term blocking table locks are not held and queries or updates to the underlying table can continue during the ALTER INDEX REORGANIZE transaction.

  • Für Rowstore-Indizes defragmentiert die Datenbank-EngineDatabase Engine die Blattebene von gruppierten und nicht gruppierten Indizes in Tabellen und Sichten, indem die Blattebenenseiten physisch neu geordnet werden, damit sie mit der logischen Reihenfolge der Blattknoten von links nach rechts übereinstimmen.For rowstore indexes, the Datenbank-EngineDatabase Engine defragments the leaf level of clustered and nonclustered indexes on tables and views by physically reordering the leaf-level pages to match the logical order of the leaf nodes (left to right). Beim Neuorganisieren werden auch die Indexseiten basierend auf dem Füllfaktorwert des Index verdichtet.Reorganizing also compacts the index pages based on the index's fill factor value. Verwenden Sie zum Anzeigen der Füllfaktoreinstellung sys.indexes.To view the fill factor setting, use sys.indexes. Syntaxbeispiele finden Sie unter Beispiele: Rowstore-Indizes.For syntax examples, see Examples: Rowstore reorganize.

  • Bei der Verwendung von Columnstore-Indizes ist es möglich, dass der Deltastore nach dem Einfügen, Aktualisieren und Löschen von Daten im Laufe der Zeit nur noch aus mehreren kleinen Zeilengruppen besteht.When using columnstore indexes, the delta store may end up with multiple small rowgroups after inserting, updating, and deleting data over time. Durch eine Neuorganisation des Columnstore-Index wird der Einschluss aller Zeilengruppen in den Columnstore erzwungen, und anschließend werden die Zeilengruppen kombiniert, sodass weniger Zeilengruppen mit mehr Zeilen entstehen.Reorganizing a columnstore index forces all of the rowgroups into the columnstore, and then combines the rowgroups into fewer rowgroups with more rows. Der Neuorganisationsvorgang entfernt auch Zeilen, die aus dem Columnstore gelöscht wurden.The reorganize operation also removes rows that have been deleted from the columnstore. Beim Neuorganisieren sind zunächst zusätzliche CPU-Ressourcen zum Komprimieren der Daten erforderlich. Dies kann die Gesamtleistung des Systems beeinträchtigen.Reorganizing initially requires additional CPU resources to compress the data, which may slow overall system performance. Sobald die Daten jedoch komprimiert sind, verbessert sich die Abfrageleistung.However, as soon as the data is compressed, query performance improves. Syntaxbeispiele finden Sie unter Beispiele: Columnstore-Indizes.For syntax examples, see Examples: ColumnStore reorganize.

Neuerstellen eines IndexesRebuild an index

Beim Neuerstellen eines Indexes wird der Index gelöscht und neu erstellt.Rebuilding an index drops and re-creates the index. Je nach Indextyp und Datenbank-EngineDatabase Engine-Version kann ein Neuerstellungsvorgang online oder offline ausgeführt werden.Depending on the type of index and Datenbank-EngineDatabase Engine version, a rebuild operation can be done online or offline. Weitere Informationen zur T-SQL-Syntax finden Sie unter Neuerstellen von Indizes.For the T-SQL syntax, see ALTER INDEX REBUILD

  • Für Rowstore-Indizes wird die Fragmentierung durch eine Neuerstellung entfernt, Speicherplatz freigegeben, indem die Seiten auf der Grundlage der angegebenen oder vorhandenen Füllfaktoreinstellung komprimiert werden, und die Indexzeilen werden in aufeinanderfolgenden Seiten neu geordnet.For rowstore indexes, rebuilding removes fragmentation, reclaims disk space by compacting the pages based on the specified or existing fill factor setting, and reorders the index rows in contiguous pages. Wenn ALL angegeben ist, werden alle Indizes der Tabelle in einer einzelnen Transaktion gelöscht und neu erstellt.When ALL is specified, all indexes on the table are dropped and rebuilt in a single transaction. Fremdschlüsseleinschränkungen müssen nicht im Voraus gelöscht werden.Foreign key constraints do not have to be dropped in advance. Wenn Indizes mit mindestens 128 Blöcken neu erstellt werden, verzögert das Datenbank-EngineDatabase Engine die tatsächlichen aufgehobenen Seitenzuordnungen sowie deren zugeordnete Sperren, bis für die Transaktion ein Commit ausgeführt wird.When indexes with 128 extents or more are rebuilt, the Datenbank-EngineDatabase Engine defers the actual page deallocations, and their associated locks, until after the transaction commits. Syntaxbeispiele finden Sie unter Beispiele: Rowstore-Indizes.For syntax examples, see Examples: Rowstore reorganize.

  • Für Columnstore-Indizes wird bei der Neuerstellung die Fragmentierung entfernt, alle Zeilen werden in den Columnstore verschoben, und Speicherplatz wird freigegeben, indem die logisch aus der Tabelle gelöschten Zeilen physisch gelöscht werden.For columnstore indexes, rebuilding removes fragmentation, moves all rows into the columnstore, and reclaims disk space by physically deleting rows that have been logically deleted from the table.

    Tipp

    Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) ist die Neuerstellung des Columnstore-Indexes in der Regel nicht notwendig, weil REORGANIZE die Grundlagen der Neuerstellung im Hintergrund als Onlinevorgang ausführt.Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x), rebuilding the columnstore index is usually not needed since REORGANIZE performs the essentials of a rebuild in the background as an online operation.

    Syntaxbeispiele finden Sie unter Beispiele: ColumnStore-Neuerstellung.For syntax examples, see Examples: ColumnStore rebuild.

BerechtigungenPermissions

Erfordert die ALTER-Berechtigung für die Tabelle oder Sicht.Requires ALTER permission on the table or view. Der Benutzer muss ein Mitglied mindestens einer der folgenden Rollen sein:User must be a member of at least one of the following roles:

  • Datenbankrolle db_ddladmin1db_ddladmin database role 1
  • Datenbankrolle db_ownerdb_owner database role
  • Serverrolle sysadminsysadmin server role

1Die Datenbankrolle db_ddladmin hat die niedrigsten Berechtigungen.1db_ddladmin database role is the least privileged.

Entfernen der Indexfragmentierung mithilfe von SQL Server Management StudioSQL Server Management StudioRemove fragmentation using SQL Server Management StudioSQL Server Management Studio

So organisieren oder erstellen Sie einen Index neuTo reorganize or rebuild an index

  1. Erweitern Sie im Objekt-Explorer die Datenbank mit der Tabelle, in der Sie einen Index neu organisieren möchten.In Object Explorer, Expand the database that contains the table on which you want to reorganize an index.
  2. Erweitern Sie den Ordner Tabellen .Expand the Tables folder.
  3. Erweitern Sie die Tabelle, in der Sie einen Index neu organisieren möchten.Expand the table on which you want to reorganize an index.
  4. Erweitern Sie den Ordner Indizes .Expand the Indexes folder.
  5. Klicken Sie mit der rechten Maustaste auf den Index, den Sie neu organisieren möchten, und wählen Sie Neu organisierenaus.Right-click the index you want to reorganize and select Reorganize.
  6. Vergewissern Sie sich im Dialogfeld Indizes neu organisieren , dass der richtige Index im Raster Neu zu organisierende Indizes ausgewählt ist, und klicken Sie auf OK.In the Reorganize Indexes dialog box, verify that the correct index is in the Indexes to be reorganized grid and click OK.
  7. Aktivieren Sie das Kontrollkästchen Spaltendaten großer Objekte komprimieren , um anzugeben, dass alle Seiten mit umfangreichen Objektdaten (Large Object, LOB) komprimiert werden sollen.Select the Compact large object column data check box to specify that all pages that contain large object (LOB) data are also compacted.
  8. Klicken Sie auf OK.Click OK.

So organisieren Sie alle Indizes in einer Tabelle neuTo reorganize all indexes in a table

  1. Erweitern Sie im Objekt-Explorer die Datenbank mit der Tabelle, in der Sie die Indizes neu organisieren möchten.In Object Explorer, Expand the database that contains the table on which you want to reorganize the indexes.
  2. Erweitern Sie den Ordner Tabellen .Expand the Tables folder.
  3. Erweitern Sie die Tabelle, in der Sie die Indizes neu organisieren möchten.Expand the table on which you want to reorganize the indexes.
  4. Klicken Sie mit der rechten Maustaste auf den Ordner Indizes , und wählen Sie Alle neu organisierenaus.Right-click the Indexes folder and select Reorganize All.
  5. Vergewissern Sie sich im Dialogfeld Index neu organisieren , dass die richtigen Indizes im Raster Neu zu organisierende Indizesausgewählt sind.In the Reorganize Indexes dialog box, verify that the correct indexes are in the Indexes to be reorganized. Um einen Index aus dem Raster Neu zu organisierende Indizes zu entfernen, wählen Sie den Index aus, und drücken Sie die ENTF-Taste.To remove an index from the Indexes to be reorganized grid, select the index and then press the Delete key.
  6. Aktivieren Sie das Kontrollkästchen Spaltendaten großer Objekte komprimieren , um anzugeben, dass alle Seiten mit umfangreichen Objektdaten (Large Object, LOB) komprimiert werden sollen.Select the Compact large object column data check box to specify that all pages that contain large object (LOB) data are also compacted.
  7. Klicken Sie auf OK.Click OK.

So erstellen Sie einen Index neuTo rebuild an index

  1. Erweitern Sie im Objekt-Explorer die Datenbank mit der Tabelle, in der Sie einen Index neu organisieren möchten.In Object Explorer, Expand the database that contains the table on which you want to reorganize an index.
  2. Erweitern Sie den Ordner Tabellen .Expand the Tables folder.
  3. Erweitern Sie die Tabelle, in der Sie einen Index neu organisieren möchten.Expand the table on which you want to reorganize an index.
  4. Erweitern Sie den Ordner Indizes .Expand the Indexes folder.
  5. Klicken Sie mit der rechten Maustaste auf den Index, den Sie neu organisieren möchten, und wählen Sie Neu erstellen aus.Right-click the index you want to reorganize and select Rebuild.
  6. Vergewissern Sie sich im Dialogfeld Indizes neu erstellen , dass der richtige Index im Raster Erneut zu erstellende Indizes ausgewählt ist, und klicken Sie auf OK.In the Rebuild Indexes dialog box, verify that the correct index is in the Indexes to be rebuilt grid and click OK.
  7. Aktivieren Sie das Kontrollkästchen Spaltendaten großer Objekte komprimieren , um anzugeben, dass alle Seiten mit umfangreichen Objektdaten (Large Object, LOB) komprimiert werden sollen.Select the Compact large object column data check box to specify that all pages that contain large object (LOB) data are also compacted.
  8. Klicken Sie auf OK.Click OK.

Entfernen der Indexfragmentierung mithilfe von Transact-SQLTransact-SQLRemove fragmentation using Transact-SQLTransact-SQL

Hinweis

Weitere Beispiele zum Verwenden von Transact-SQLTransact-SQL zur Neuerstellung oder Neuorganisation von Indizes finden Sie unter ALTER INDEX-Beispiele: Columnstore-Indizes und ALTER INDEX-Beispiele: Rowstore-Indizes.For more examples about using Transact-SQLTransact-SQL to rebuild or reorganize indexes, see ALTER INDEX Examples: Columnstore Indexes and ALTER INDEX Examples: Rowstore Indexes.

So organisieren Sie einen fragmentierten Index neuTo reorganize a fragmented index

Im folgenden Beispiel wird der IX_Employee_OrganizationalLevel_OrganizationalNode-Index für die HumanResources.Employee-Tabelle in der AdventureWorks2016-Datenbank neu organisiert.The following example reorganizes the IX_Employee_OrganizationalLevel_OrganizationalNode index on the HumanResources.Employee table in the AdventureWorks2016 database.

ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode
    ON HumanResources.Employee
    REORGANIZE;

Im folgenden Beispiel wird der IndFactResellerSalesXL_CCI-Columnstore-Index für die dbo.FactResellerSalesXL_CCI-Tabelle in der AdventureWorksDW2016-Datenbank neu organisiert.The following example reorganizes the IndFactResellerSalesXL_CCI columnstore index on the dbo.FactResellerSalesXL_CCI table in the AdventureWorksDW2016 database.

-- This command will force all CLOSED and OPEN rowgroups into the columnstore.
ALTER INDEX IndFactResellerSalesXL_CCI
    ON FactResellerSalesXL_CCI
    REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

So organisieren Sie alle Indizes in einer Tabelle neuTo reorganize all indexes in a table

Im folgenden Beispiel werden alle Indizes für die HumanResources.Employee-Tabelle in der AdventureWorks2016-Datenbank neu organisiert.The following example reorganizes all indexes on the HumanResources.Employee table in the AdventureWorks2016 database.

ALTER INDEX ALL ON HumanResources.Employee
   REORGANIZE;

So erstellen Sie einen fragmentierten Index neuTo rebuild a fragmented index

Im folgenden Beispiel wird ein einzelner Index für die Employee-Tabelle der AdventureWorks2016-Datenbank neu erstellt.The following example rebuilds a single index on the Employee table in the AdventureWorks2016 database.

ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD
;

So erstellen Sie alle Indizes in einer Tabelle neuTo rebuild all indexes in a table

Im folgende Beispiel werden alle Indizes, die der Tabelle in der AdventureWorks2016-Datenbank zugeordnet sind, mithilfe des Schlüsselworts ALL neu erstellt.The following example rebuilds all indexes associated with the table in the AdventureWorks2016 database using the ALL keyword. Es werden drei Optionen angegeben.Three options are specified.

ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON)
;

Weitere Informationen finden Sie unter ALTER INDEX (Transact-SQL).For more information, see ALTER INDEX (Transact-SQL).

Automatische Verwaltung von Index und StatistikenAutomatic index and statistics management

Nutzen Sie Lösungen wie Adaptive Index Defrag, um die Indexdefragmentierung und das Aktualisieren der Statistiken für eine oder mehrere Datenbanken automatisch zu verwalten.Leverage solutions such as Adaptive Index Defrag to automatically manage index defragmentation and statistics updates for one or more databases. Dieser Vorgang entscheidet unter anderem anhand des Fragmentierungsgrads automatisch, ob ein Index neu organisiert oder neu erstellt wird und aktualisiert Statistiken mit einem linearen Schwellenwert.This procedure automatically chooses whether to rebuild or reorganize an index according to its fragmentation level, amongst other parameters, and update statistics with a linear threshold.

Überlegungen zur Neuerstellung eines Rowstore-IndexConsiderations specific to rebuilding rowstore indexes

Die Neuerstellung eines gruppierten Index führt dazu, dass alle nicht gruppierten Indizes, in denen auf den Gruppierungsschlüssel verwiesen wird, automatisch neu erstellt werden, wenn die physischen oder logischen IDs geändert werden müssen, die sich in den nicht gruppierten Indexdatensätzen befinden.Rebuilding a clustered index automatically rebuilds any nonclustered index that reference the clustering key, if the physical or logical identifiers contained in the nonclustered index records need to change.

In den folgenden Szenarios wird erzwungen, dass alle nicht gruppierten Rowstore-Indizes für eine Tabelle automatisch neu erstellt werden:The following scenarios force all rowstore nonclustered indexes on a table to be automatically rebuilt:

  • Erstellen eines gruppierten Indexes für eine TabelleCreating a clustered index on a table
  • Entfernen eines gruppierten Index, was zur Folge hat, dass die Tabelle als Heap gespeichert wirdRemoving a clustered index, which causes the table to be stored as a heap
  • Ändern des Gruppierungsschlüssels, um Spalten einzubeziehen oder auszuschließenChanging the clustering key to include or exclude columns

In den folgenden Szenarios ist es nicht erforderlich, dass alle nicht gruppierten Rowstore-Indizes für eine Tabelle automatisch neu erstellt werden:The following scenarios do not require all rowstore nonclustered indexes to be automatically rebuilt on a table:

  • Neuerstellen eines eindeutigen gruppierten IndexesRebuilding a unique clustered index
  • Neuerstellen eines nicht eindeutigen gruppierten IndexesRebuilding a non-unique clustered index
  • Ändern des Indexschemas, beispielsweise Anwenden eines Partitionierungsschemas auf einen gruppierten Index oder Verschieben des gruppierten Indexes in eine andere DateigruppeChanging the index schema, such as applying a partitioning scheme to a clustered index or moving the clustered index to a different filegroup

Wichtig

Ein Index kann nicht neu organisiert oder neu erstellt werden, wenn die Dateigruppe, in der er enthalten ist, eine Offline- oder schreibgeschützte Dateigruppe ist.An index cannot be reorganized or rebuilt if the filegroup in which it is located is offline or set to read-only. Wenn das Schlüsselwort ALL angegeben ist und mindestens ein Index in einer Offline- oder schreibgeschützten Dateigruppe enthalten ist, erzeugt die Anweisung einen Fehler.When the keyword ALL is specified and one or more indexes are in an offline or read-only filegroup, the statement fails.

Während der Neuerstellung eines Indexes muss das physische Medium über genügend Speicherplatz verfügen, um zwei Kopien des Indexes zu speichern.While an index rebuild occurs, the physical media must have enough space to store two copies of the index. Nach Abschluss der Neuerstellung löscht Datenbank-EngineDatabase Engine den ursprünglichen Index.When the rebuild is finished, the Datenbank-EngineDatabase Engine deletes the original index.

Wenn ALL mit der ALTER INDEX-Anweisung angegeben wird, werden relationale Indizes – sowohl gruppierte als auch nicht gruppierte – und XML-Indizes der Tabelle neu organisiert.When ALL is specified with the ALTER INDEX statement, relational indexes, both clustered and nonclustered, and XML indexes on the table are reorganized.

Überlegungen zur Neuerstellung eines Columnstore-IndexesConsiderations specific to rebuilding a columnstore index

Bei der Neuerstellung eines Columnstore-Indexes liest die Datenbank-EngineDatabase Engine alle Daten aus dem ursprünglichen Columnstore-Index, einschließlich des Deltastore.When rebuilding a columnstore index, the Datenbank-EngineDatabase Engine reads all data from the original columnstore index, including the delta store. Die Daten werden in neuen Zeilengruppen zusammengefasst, und die Zeilengruppen werden in den Columnstore-Index komprimiert.It combines the data into new rowgroups, and compresses the rowgroups into the columnstore. Datenbank-EngineDatabase Engine defragmentiert den Columnstore, indem Zeilen physisch gelöscht werden, die logisch aus der Tabelle entfernt wurden.The Datenbank-EngineDatabase Engine defragments the columnstore by physically deleting rows that have been logically deleted from the table. Die gelöschten Byte werden auf dem Datenträger freigegeben.The deleted bytes are reclaimed on the disk.

Hinweis

Bei der Neuorganisation eines Columnstore-Index mit Management StudioManagement Studio werden COMPRESSED-Zeilengruppen kombiniert, aber es wird keine Komprimierung aller Zeilengruppen im Columnstore erzwungen.Reorganizing a columnstore index using Management StudioManagement Studio will combine COMPRESSED rowgroups together, but does not force all rowgroups to be compressed into the columnstore. CLOSED-Zeilengruppen werden komprimiert, aber OPEN-Zeilengruppen werden nicht im Columnstore komprimiert.CLOSED rowgroups will be compressed but OPEN rowgroups will not be compressed into the columnstore. Um das Komprimieren aller Zeilengruppen zu erzwingen, verwenden Sie das unten angegebene Transact-SQLTransact-SQL-Beispiel.To forcibly compress all rowgroups, use the Transact-SQLTransact-SQL example below.

Hinweis

Ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) wird der Tupelverschiebungsvorgang von einem Mergetask im Hintergrund unterstützt, der automatisch kleinere OPEN-Deltazeilengruppen komprimiert, die für einen bestimmten Zeitraum vorhanden waren (wie durch einen internen Schwellenwert festgelegt), oder COMPRESSED-Zeilengruppen mergt, aus denen eine große Anzahl von Zeilen gelöscht wurde.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), the tuple-mover is helped by a background merge task that automatically compresses smaller OPEN delta rowgroups that have existed for some time as determined by an internal threshold, or merges COMPRESSED rowgroups from where a large number of rows has been deleted. Dies verbessert die Qualität des Columnstore-Index im Lauf der Zeit.This improves the columnstore index quality over time.
Weitere Informationen zu Columnstore-Begriffen und -Konzepten finden Sie unter Columnstore-Indizes: Übersicht.For more information about columnstore terms and concepts, see Columnstore indexes: Overview.

Neuerstellen einer Partition anstatt der gesamten TabelleRebuild a partition instead of the entire table

  • Wenn der Index groß ist, nimmt das Neuerstellen der gesamten Tabelle viel Zeit in Anspruch, und es muss ausreichend Speicherplatz verfügbar sein, um während der Neuerstellung eine zusätzliche Kopie des Indexes speichern zu können.Rebuilding the entire table takes a long time if the index is large, and it requires enough disk space to store an additional copy of the index during the rebuild. In der Regel muss nur die zuletzt verwendete Partition neu erstellt werden.Usually it is only necessary to rebuild the most recently used partition.
  • Bei partitionierten Tabellen müssen Sie nicht den gesamten Columnstore-Index neu erstellen, da die Fragmentierung wahrscheinlich nur in den Partitionen vorliegt, die kürzlich geändert wurden.For partitioned tables, you do not need to rebuild the entire columnstore index because fragmentation is likely to occur in only the partitions that have been modified recently. Faktentabellen und große Dimensionstabellen werden i. d. R. partitioniert, um Sicherungs- und Verwaltungsvorgänge für Segmente der Tabelle auszuführen.Fact tables and large dimension tables are usually partitioned in order to perform backup and management operations on chunks of the table.

Neuerstellen einer Partition nach intensiven DML-VorgängenRebuild a partition after heavy DML operations

Durch das Neuerstellen einer Partition wird die Partition defragmentiert und der benötigte Festplattenspeicherplatz reduziert.Rebuilding a partition defragments the partition and reduces disk storage. Beim Neuerstellen werden alle zum Löschen markierten Zeilen aus dem Columnstore gelöscht und alle Zeilengruppen aus dem Deltastore in den Columnstore verschoben.Rebuilding deletes all rows from the columnstore that are marked for deletion and moves all rowgroups from the delta store into the columnstore. Es können mehrere Zeilengruppen im Deltastore vorhanden sein, die weniger als eine Million Zeilen enthalten.There can be multiple rowgroups in the delta store that have less than one million rows.

Neuerstellen einer Partition nach DatenladevorgängenRebuild a partition after loading data

Das Neuerstellen einer Partition nach dem Laden von Daten stellt sicher, dass alle Daten im Columnstore gespeichert werden.Rebuilding a partition after loading date ensures all data is stored in the columnstore. Wenn parallel ausgeführte Prozesse gleichzeitig jeweils weniger als 100.000 Zeilen in dieselbe Partition laden, kann die Partition anschließend mehrere Deltastores aufweisen.When concurrent processes each load less than 100,000 rows into the same partition at the same time, the partition can end up with multiple delta stores. Durch das Neuerstellen werden alle Deltastore-Zeilen in den Columnstore verschoben.Rebuilding moves all delta store rows into the columnstore.

Überlegungen zur Neuorganisation eines Columnstore-IndexesConsiderations specific to reorganizing a columnstore index

Bei der Neuorganisation eines Columnstore-Indizes komprimiert die Datenbank-EngineDatabase Engine jede CLOSED-Deltazeilengruppe im Columnstore als eine komprimierte Zeilengruppe.When reorganizing a columnstore index, the Datenbank-EngineDatabase Engine compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. Ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) und in Azure SQL-DatenbankAzure SQL Database führt der REORGANIZE-Befehl die folgenden Optimierungen für eine zusätzliche Defragmentierung online aus:Starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) and in Azure SQL-DatenbankAzure SQL Database, the REORGANIZE command performs the following additional defragmentation optimizations online:

  • Es werden Zeilen physisch aus der Zeilengruppe entfernt, wenn mindestens 10 % der Zeilen logisch gelöscht wurden.Physically removes rows from a rowgroup when 10% or more of the rows have been logically deleted. Die gelöschten Bytes werden auf den physischen Medien freigegeben.The deleted bytes are reclaimed on the physical media. Bei einer komprimierten Zeilengruppe mit 1 Million Zeilen, in der beispielsweise 100.000 Zeilen gelöscht wurden, werden von SQL ServerSQL Server die gelöschten Zeilen entfernt, und die Zeilengruppe wird mit 900.000 Zeilen neu komprimiert.For example, if a compressed row group of 1 million rows has 100K rows deleted, SQL ServerSQL Server will remove the deleted rows and recompress the rowgroup with 900k rows. Durch das Entfernen gelöschter Zeilen wird Speicherplatz eingespart.It saves on the storage by removing deleted rows.

  • Eine oder mehrere komprimierte Zeilengruppen werden kombiniert, um die Anzahl der Zeilen pro Zeilengruppe auf maximal 1.048.576 Zeilen zu erhöhen.Combines one or more compressed rowgroups to increase rows per rowgroup up to the maximum of 1,048,576 rows. Bei einem Massenexport von 5 Batches mit 102.400 Zeilen erhalten Sie beispielsweise 5 komprimierte Zeilengruppen.For example, if you bulk import 5 batches of 102,400 rows you will get 5 compressed rowgroups. Wenn Sie REORGANIZE ausführen, werden diese Zeilengruppen in eine komprimierte Zeilengruppe mit 512.000 Zeilen zusammengeführt.If you run REORGANIZE, these rowgroups will get merged into 1 compressed rowgroup of size 512,000 rows. Dies setzt voraus, dass keine Wörterbuchumfangsbegrenzungen oder Arbeitsspeichereinschränkungen vorhanden sind.This assumes there were no dictionary size or memory limitations.

  • Zeilengruppen, in denen mindestens 10 % der Zeilen logisch gelöscht wurden, versucht die Datenbank-EngineDatabase Engine mit einer oder mehreren Zeilengruppen zu kombinieren.For rowgroups in which 10% or more of the rows have been logically deleted, the Datenbank-EngineDatabase Engine tries to combine this rowgroup with one or more rowgroups. Beispiel: Zeilengruppe 1 ist mit 500.000 Zeilen komprimiert und Zeilengruppe 21 mit dem Maximalwert von 1.048.576 Zeilen.For example, rowgroup 1 is compressed with 500,000 rows and rowgroup 21 is compressed with the maximum of 1,048,576 rows. In Zeilengruppe 21 wurden 60 % der Zeilen gelöscht, wodurch noch 409.830 Zeilen vorhanden sind.Rowgroup 21 has 60% of the rows deleted which leaves 409,830 rows. In Datenbank-EngineDatabase Engine werden diese beiden Zeilengruppen vorzugsweise kombiniert, um eine neue Zeilengruppe mit 909.830 Zeilen zu komprimieren.The Datenbank-EngineDatabase Engine favors combining these two rowgroups to compress a new rowgroup that has 909,830 rows.

Nach dem Ausführen von Datenladevorgängen weist Ihr Deltastore möglicherweise mehrere kleine Zeilengruppen auf.After performing data loads, you can have multiple small rowgroups in the delta store. Sie können ALTER INDEX REORGANIZE verwenden, um alle Zeilengruppen in den Columnstore zu zwingen und anschließend zu kombinieren, sodass weniger Zeilengruppen mit mehr Zeilen entstehen.You can use ALTER INDEX REORGANIZE to force all of the rowgroups into the columnstore, and then to combine the rowgroups into fewer rowgroups with more rows. Der Neuorganisationsvorgang entfernt auch Zeilen, die aus dem Columnstore gelöscht wurden.The reorganize operation will also remove rows that have been deleted from the columnstore.

EinschränkungenLimitations and restrictions

Rowstore-Indizes mit mehr als 128 Blöcken werden in zwei getrennten Phasen neu erstellt: der logischen und der physischen Phase.Rowstore indexes with more than 128 extents are rebuilt in two separate phases: logical and physical. In der logischen Phase werden die vorhandenen Zuordnungseinheiten, die vom Index verwendet werden, für die Aufhebung der Zuordnung markiert, die Datenzeilen werden kopiert und sortiert und dann in neue Zuordnungseinheiten verschoben, die erstellt werden, um den neu erstellten Index zu speichern.In the logical phase, the existing allocation units used by the index are marked for deallocation, the data rows are copied and sorted, then moved to new allocation units created to store the rebuilt index. In der physischen Phase werden die zuvor für die Aufhebung der Zuordnung markierten Zuordnungseinheiten in kurzen Transaktionen physisch gelöscht, die im Hintergrund ausgeführt werden und nicht viele Sperren benötigen.In the physical phase, the allocation units previously marked for deallocation are physically dropped in short transactions that happen in the background, and do not require many locks. Weitere Informationen zu Blöcken finden Sie im Handbuch zur Architektur von Seiten und Blöcken.For more information about extents, see Pages and Extents Architecture Guide.

Die ALTER INDEX REORGANIZE-Anweisung erfordert, dass die Datendatei mit dem Index über Platz verfügt, da der Vorgang temporäre Arbeitsseiten nur in der gleichen Datei zuordnen kann, nicht in einer anderen Datei der Dateigruppe.The ALTER INDEX REORGANIZE statement requires the data file containing the index to have space available, because the operation can only allocate temporary work pages on the same file, not in another file within the filegroup. Selbst wenn in einer Dateigruppe leere Seiten verfügbar sind, kann für den Benutzer daher trotzdem Fehler 1105 auftreten: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.So although the filegroup might have free pages available, the user can still encounter error 1105: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

Warnung

Das Erstellen bzw. Neuerstellen von nicht ausgerichteten Indizes für eine Tabelle mit mehr als 1.000 Partitionen ist möglich, wird aber nicht unterstützt.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. Dies hätte Leistungseinbußen oder eine zu hohe Speicherauslastung während der Vorgänge zur Folge.Doing so may cause degraded performance or excessive memory consumption during these operations. Microsoft empfiehlt, bei mehr als 1.000 Partitionen nur ausgerichtete Indizes zu verwenden.Microsoft recommends using only aligned indexes when the number of partitions exceed 1,000.

Ein Index kann nicht neu organisiert oder neu erstellt werden, wenn die Dateigruppe, in der er enthalten ist, offline ist oder als schreibgeschützt festgelegt wurde.An index cannot be reorganized or rebuilt if the filegroup in which it is located is offline or set to read-only. Wenn das Schlüsselwort ALL angegeben ist und mindestens ein Index in einer Offline- oder schreibgeschützten Dateigruppe enthalten ist, erzeugt die Anweisung einen Fehler.When the keyword ALL is specified and one or more indexes are in an offline or read-only filegroup, the statement fails.

StatistikenStatistics:

  • Wenn ein Index erstellt oder neu erstellt wird, werden Statistiken erstellt oder aktualisiert, indem alle Zeilen in der Tabelle gescannt werden.When an index is created or rebuilt, statistics are created or updated by scanning all the rows in the table. Ab SQL Server 2012 (11.x)SQL Server 2012 (11.x) werden Statistiken aber mehr nicht durch das Scannen aller Zeilen in der Tabelle erstellt oder aktualisiert, wenn ein partitionierter Index erstellt oder neu erstellt wird.However, starting with SQL Server 2012 (11.x)SQL Server 2012 (11.x), statistics are not created or updated by scanning all the rows in the table when a partitioned index is created or rebuilt. Stattdessen verwendet der Abfrageoptimierer den Standardalgorithmus zur Stichprobenentnahme, um diese Statistiken zu generieren.Instead, the Query Optimizer uses the default sampling algorithm to generate these statistics. Verwenden Sie CREATE STATISTICS oder UPDATE STATISTICS mit der FULLSCAN-Klausel, um Statistiken zu partitionierten Indizes durch das Scannen aller Zeilen in der Tabelle abzurufen.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

  • Wenn ein Index neu organisiert wird, werden die Statistiken nicht aktualisiert.When an index is reorganized, statistics are not updated.

Ein Index kann nicht neu organisiert werden, wenn ALLOW_PAGE_LOCKS auf OFF festgelegt ist.An index cannot be reorganized when ALLOW_PAGE_LOCKS is set to OFF.

Bis SQL Server 2017 (14.x)SQL Server 2017 (14.x) wird die Neuerstellung eines gruppierten Columnstore-Indexes als Offlinevorgang durchgeführt.Up to SQL Server 2017 (14.x)SQL Server 2017 (14.x), rebuilding a clustered columnstore index is an offline operation. Die Datenbank-Engine muss eine exklusive Sperre für die Tabelle oder Partition abrufen, während die Neuerstellung ausgeführt wird.The database engine has to acquire an exclusive lock on the table or partition while the rebuild occurs. Die Daten sind während der Neuerstellung offline und nicht verfügbar, selbst bei Verwendung von NOLOCK, Read Commited-Momentaufnahmeisolation (RCSI) oder Momentaufnahmeisolation.The data is offline and unavailable during the rebuild even when using NOLOCK, Read-committed Snapshot Isolation (RCSI), or Snapshot Isolation. Ab SQL Server 2019 (15.x)SQL Server 2019 (15.x) kann ein gruppierter Columnstore-Index mit der Option ONLINE = ON neu erstellt werden.Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x), a clustered columnstore index can be rebuilt using the ONLINE = ON option.

Bei einer Azure Synapse Analytics-Tabelle (früher SQL Data WarehouseSQL Data Warehouse) mit einem sortierten gruppierten Columnstore-Index werden mit ALTER INDEX REBUILD die Daten mit TempDB neu sortiert.For an Azure Synapse Analytics (formerly SQL Data WarehouseSQL Data Warehouse) table with an ordered clustered columnstore index, ALTER INDEX REBUILD will re-sort the data using TempDB. Überwachen Sie TempDB während der Neuerstellungsvorgänge.Monitor TempDB during rebuild operations. Wenn Sie mehr TempDB-Speicherplatz benötigen, können Sie die Data Warehouse-Instanz hochskalieren.If you need more TempDB space, scale up the data warehouse. Skalieren Sie es nach Abschluss der Indexneuerstellung wieder herunter.Scale back down once the index rebuild is complete.

Bei einer Azure Synapse Analytics-Tabelle (früher SQL Data WarehouseSQL Data Warehouse) mit einem sortierten gruppierten Columnstore-Index werden mit ALTER INDEX REORGANIZE die Daten nicht neu sortiert.For an Azure Synapse Analytics (formerly SQL Data WarehouseSQL Data Warehouse) table with an ordered clustered columnstore index, ALTER INDEX REORGANIZE does not re-sort the data. Verwenden Sie ALTER INDEX REBUILD zum Neusortieren der Daten.To resort the data use ALTER INDEX REBUILD.

Verwenden von INDEX REBUILD zur Wiederherstellung nach HardwarefehlernUsing INDEX REBUILD to recover from hardware failures

In Vorgängerversionen von SQL ServerSQL Server konnte in einigen Fällen ein nicht gruppierter Rowstore-Index neu erstellt werden, um durch Hardwarefehler verursachte Inkonsistenzen zu korrigieren.In earlier versions of SQL ServerSQL Server, you could sometimes rebuild a rowstore nonclustered index to correct inconsistencies caused by hardware failures. Ab SQL Server 2008SQL Server 2008 sind Sie u. U. weiterhin in der Lage, solche Inkonsistenzen zwischen dem Index und dem gruppierten Index zu beheben, indem Sie einen nicht gruppierten Index offline erstellen.Starting with SQL Server 2008SQL Server 2008, you may still be able to repair such inconsistencies between the index and the clustered index by rebuilding a nonclustered index offline. Sie können die Inkonsistenzen eines nicht gruppierten Index jedoch nicht beheben, indem Sie den Index online neu erstellen, da der Onlineneuerstellungsmechanismus den vorhandenen nicht gruppierten Index als Grundlage für die Neuerstellung verwendet und somit die Inkonsistenzen bestehen bleiben.However, you cannot repair nonclustered index inconsistencies by rebuilding the index online, because the online rebuild mechanism uses the existing nonclustered index as the basis for the rebuild and thus persist the inconsistency. Wird der Index offline neu erstellt, wird in manchen Fällen ein Scan des gruppierten Indexes (oder Heaps) erzwungen. um dadurch Inkonsistenzen zu entfernen.Rebuilding the index offline can sometimes force a scan of the clustered index (or heap) and so remove the inconsistency. Löschen Sie den nicht gruppierten Index, und erstellen Sie ihn neu, um eine Neuerstellung über den gruppierter Index zu gewährleisten.To assure a rebuild from the clustered index, drop and recreate the nonclustered index. Wie in früheren Versionen wird zum Entfernen von Inkonsistenzen empfohlenen, die betroffenen Daten aus einer Sicherung wiederherzustellen. Die Inkonsistenzen des Indexes können möglicherweise auch behoben werden, indem der nicht gruppierte Index offline neu erstellt wird.As with earlier versions, we recommend recovering from inconsistencies by restoring the affected data from a backup; however, you may be able to repair the index inconsistencies by rebuilding the nonclustered index offline. Weitere Informationen finden Sie unter DBCC CHECKDB (Transact-SQL).For more information, see DBCC CHECKDB (Transact-SQL).

Weitere InformationenSee also