Neuorganisieren und Neuerstellen von IndizesReorganize and rebuild indexes

GILT FÜR: jaSQL Server jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

In diesem Artikel wird beschrieben, wie Sie einen fragmentierten Index in SQL ServerSQL Server mithilfe von SQL Server Management StudioSQL Server Management Studio oder Transact-SQLTransact-SQL neu organisieren oder erneut erstellen.This article describes how to reorganize or rebuild a fragmented index in SQL ServerSQL Server by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. SQL Server-Datenbank-EngineSQL Server Database Engine verwaltet Indizes automatisch, wenn Einfüge-, Update- oder Löschvorgänge an den zugrunde liegenden Daten vorgenommen werden.The SQL Server-Datenbank-EngineSQL Server Database Engine automatically modifies indexes whenever insert, update, or delete operations are made to the underlying data. 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. Hochgradig fragmentierte Indizes können die Abfrageleistung beeinträchtigen und dazu führen, dass Ihre Anwendung nur langsam reagiert.Heavily fragmented indexes can degrade query performance and cause your application to respond slowly, especially scan operations.

Sie können die Indexfragmentierung durch Neuorganisieren oder Neuerstellen eines Indexes beheben.You can remedy index fragmentation by reorganizing or rebuilding an index. Für partitionierte Indizes, die auf Grundlage eines Partitionsschemas erstellt wurden, können beide Methoden für einen vollständigen Index oder für eine einzelne Partition eines Indexes verwendet werden:For partitioned indexes built on a partition scheme, you can use either of these methods on a complete index or a single partition of an index:

  • Das Neuorganisieren eines Indexes 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 wird die Blattebene von gruppierten und nicht gruppierten Indizes in Tabellen und Sichten defragmentiert, indem die Blattebenenseiten physisch neu geordnet werden, damit sie mit der logischen Reihenfolge der Blattknoten von links nach rechts übereinstimmen.For rowstore indexes, it defragments the leaf level of clustered and nonclustered indexes on tables and views by physically reordering the leaf-level pages to match the logical, left to right, order of the leaf nodes. Durch das Neuorganisieren werden die Indexseiten auch komprimiert.Reorganizing also compacts the index pages. Die Komprimierung basiert auf dem vorhandenen Füllfaktorwert.Compaction is based on the existing fill factor value. Verwenden Sie zum Anzeigen der Füllfaktoreinstellung sys.indexes.To view the fill factor setting, use sys.indexes.
    • Bei der Verwendung von Columnstore-Indizes kann der Deltastore nach dem Laden von Daten mehrere kleine Zeilengruppen umfassen.When using columnstore indexes, it is possible that after loading data the delta store has multiple small rowgroups. 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 the 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 will also remove 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 will initially require additional CPU resources to compress the data, which could slow overall system performance. Sobald die Daten jedoch komprimiert sind, kann sich die Abfrageleistung verbessern.However, as soon as the data is compressed, query performance can improve.
  • Beim Neuerstellen eines Indexes wird der Index gelöscht und neu erstellt.Rebuilding an index drops and re-creates the index. Abhängig vom Typ des Indexes und der Datenbank-EngineDatabase Engine-Version kann diese Neuerstellung online oder offline erfolgen.Depending on the type of index and Datenbank-EngineDatabase Engine version, this can be done online or offline.

    • Für Rowstore-Indizes wird die Fragmentierung 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.
    • 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. 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.

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 Indexes 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 will use 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).

Erkennen einer FragmentierungDetecting fragmentation

Der erste Schritt bei der Entscheidung für eine Defragmentierungsmethode besteht im Analysieren des Indexes, um den Fragmentierungsgrad zu ermitteln.The first step in deciding which defragmentation method to use is to analyze the index to determine the degree of fragmentation.

Erkennen einer Fragmentierung für Rowstore-IndizesDetecting fragmentation on rowstore indexes

Mithilfe der Systemfunktion 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 the system function 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 die Funktion sys.dm_db_index_physical_stats zurückgegebene Resultset umfasst die folgenden Spalten:The result set returned by the sys.dm_db_index_physical_stats function includes the following columns:

SpalteColumn und 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 folgenden Tabelle, um die beste Methode zum Beheben der Fragmentierung zu ermitteln.After the degree of fragmentation is known, use the following table to determine the best method to correct the fragmentation.

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

1 Das Neuerstellen eines Indexes kann online oder offline erfolgen.1 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 Ausführen von Onlineindexvorgängen .For more information, see Perform Index Operations Online.

Tipp

Diese Werte dienen als grobe Richtlinie, um den Punkt zu bestimmen, an dem Sie zwischen ALTER INDEX REORGANIZE und ALTER INDEX REBUILD wechseln sollten.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. 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. Für Indizes, die in erster Linie für Suchvorgänge verwendet werden, fällt der Leistungsvorteil weniger auf.The performance benefit is less 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.

Bei sehr niedrigen Fragmentierungsniveaus (unter 5 Prozent) sollten diese Befehle normalerweise nicht eingesetzt werden, da die Vorteile des Entfernens einer so geringen Fragmentierung die Kosten für das Neuorganisieren und Neuerstellen des Indexes nicht aufwiegen.Very low levels of fragmentation (less than 5 percent) should typically not be addressed by either of these commands, because the benefit from removing such a small amount of fragmentation is almost always vastly outweighed by the cost of reorganizing or rebuilding the index. Weitere Informationen zu ALTER INDEX REORGANIZE und ALTER INDEX REBUILD finden Sie unter ALTER INDEX (Transact-SQL).For more information about ALTER INDEX REORGANIZE and ALTER INDEX REBUILD, refer to ALTER INDEX (Transact-SQL).

Hinweis

Durch das erneute Erstellen oder Organisieren kleiner Rowstore-Indizes lässt sich die Fragmentierung häufig nicht verringern.Rebuilding or reorganizing small rowstore indexes often does not reduce fragmentation. Die Seiten kleiner Indizes werden manchmal in gemischten Blöcken gespeichert.The 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.

Erkennen einer Fragmentierung für Columnstore-IndizesDetecting fragmentation on columnstore indexes

Durch Verwendung der DMV sys.dm_db_column_store_row_group_physical_stats können Sie den Prozentsatz der gelöschten Zeilen ermitteln, der ein gutes Maß für die Fragmentierung in einer Zeilengruppe darstellt.By using the DMV sys.dm_db_column_store_row_group_physical_stats you can determine the percentage of deleted rows, which is a good measure for the fragmentation in a rowgroup. 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 die DMV sys.dm_db_column_store_row_group_physical_stats zurückgegebene Resultset umfasst die folgenden Spalten:The result set returned by the sys.dm_db_column_store_row_group_physical_stats DMV includes the following columns:

SpalteColumn und 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 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.

Hierüber kann die Fragmentierung mithilfe der Formel 100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0) berechnet werden.This can be used to compute the fragmentation using the formula 100*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0). Nachdem der Grad der Fragmentierung bekannt ist, verwenden Sie die folgenden Tabelle, um die beste Methode zum Beheben der Fragmentierung zu ermitteln.After the degree of fragmentation is known, use the following table to determine the best method to correct the fragmentation.

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

Überlegungen zur IndexdefragmentierungIndex defragmentation considerations

Bei Zutreffen bestimmter Bedingungen führt eine Neuerstellung eines gruppierten Indexes 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.Under certain conditions, rebuilding a clustered index will automatically rebuild any nonclustered index that reference the clustering key, if the physical or logical identifiers contained in the nonclustered index records need to change.

In diesen Szenarien wird erzwungen, dass alle nicht gruppierten Rowstore-Indizes für eine Tabelle automatisch neu erstellt werden:Scenarios that force all rowstore nonclustered indexes to be automatically rebuilt on a table:

  • Erstellen eines gruppierten Indexes für eine TabelleCreating a clustered index on a table
  • Entfernen eines gruppierten Indexes, was zur Folge hat, dass die Tabelle als Heap gespeichert wirdRemoving a clustered index, causing 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 diesen Szenarien ist es nicht erforderlich, dass alle nicht gruppierten Rowstore-Indizes für eine Tabelle automatisch neu erstellt werden:Scenarios that 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.

Wichtig

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 SQL ServerSQL Server den ursprünglichen Index.When the rebuild is finished, SQL ServerSQL Server 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. Die Datenbank-EngineDatabase Engine defragmentiert den Columnstore, indem physisch Zeilen gelöscht werden, die logisch aus der Tabelle gelöscht wurden. Die gelöschten Bytes werden auf dem Datenträger freigegeben.The Datenbank-EngineDatabase Engine defragments the columnstore by physically deleting rows that have been logically deleted from the table; the deleted bytes are reclaimed on the disk.

Erstellen Sie nicht die gesamte Tabelle, sondern nur eine Partition neu:Rebuild 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.

Erstellen Sie eine Partition nach intensiven DML-Vorgängen neu:Rebuild a partition after heavy DML operations:

  • Durch das Neuerstellen einer Partition wird die Partition defragmentiert und der benötigte Festplattenspeicherplatz reduziert.Rebuilding a partition will defragment the partition and reduce 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 will delete all rows from the columnstore that are marked for deletion, and it will move all rowgroups from the delta store into the columnstore. Beachten Sie, dass mehrere Zeilengruppen im Deltastore vorhanden sein können, die weniger als eine Million Zeilen enthalten.Note, there can be multiple rowgroups in the delta store that have less than one million rows.

Erstellen Sie eine Partition neu, nachdem Sie Daten geladen haben:Rebuild a partition after loading data:

  • Dadurch wird sichergestellt, dass alle Daten im Columnstore gespeichert sind.This 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 will move 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 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 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.024.576 Zeilen zu erhöhen.Combines one or more compressed rowgroups to increase rows per rowgroup up to the maximum of 1,024,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 will try 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, refer to the 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 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.

Wenn ein Index in SQL ServerSQL Server 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 in SQL ServerSQL Server, 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. Um Statistiken zu partitionierten Indizes durch das Scannen aller Zeilen in der Tabelle abzurufen, verwenden Sie CREATE STATISTICS oder UPDATE STATISTICS mit der FULLSCAN-Klausel.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 in SQL ServerSQL Server neu organisiert wird, werden die Statistiken nicht aktualisiert.When an index is reorganized in SQL ServerSQL Server, 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-EngineDatabase Engine muss eine exklusive Sperre für die Tabelle oder Partition abrufen, während die Neuerstellung ausgeführt wird.The Datenbank-EngineDatabase 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 2019SQL Server 2019 kann ein gruppierter Columnstore-Index mit der Option ONLINE=ON neu erstellt werden.Starting with SQL Server 2019SQL Server 2019, a clustered columnstore index can be rebuilt using the ONLINE=ON option.

Bei einer Azure SQL Data Warehouse-Tabelle mit einem sortierten gruppierten Columnstore-Index werden mit ALTER INDEX REBUILD die Daten mit TempDB neu sortiert.For an Azure SQL 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 zentral 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 SQL Data Warehouse-Tabelle mit einem sortierten gruppierten Columnstore-Index werden mit ALTER INDEX REORGANIZE die Daten nicht neu sortiert.For an Azure SQL 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.

SicherheitSecurity

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_ddladmin 1db_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.

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

Hinweis

Management StudioManagement Studio kann nicht verwendet werden, um die Fragmentierung von Columnstore-Indizes zu berechnen.cannot be used to compute fragmentation of columnstore indexes. Verwenden Sie das unten angegebene Transact-SQLTransact-SQL-Beispiel.Use the Transact-SQLTransact-SQL example below.

  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:

    Seitenfüllgrad Page 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 gesamt: Prozentwert der logischen Fragmentierung.Total fragmentation 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öße Average row size
    Die durchschnittliche Größe einer Zeile auf Blattebene.The average size of a leaf-level row.

    Tiefe Depth
    Die Anzahl von Ebenen im Index, einschließlich der Blattebene.The number of levels in the index, including the leaf-level.

    Weitergeleitete Datensätze Forwarded 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 Zeilen Ghost 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.

    Indextyp Index 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 Blattebene Leaf-level rows
    Die Anzahl von Zeilen auf Blattebene.The number of leaf-level rows.

    Maximale Zeilengröße Maximum row size
    Maximale Größe von Zeilen auf Blattebene.The maximum leaf-level row size.

    Minimale Zeilengröße Minimum row size
    Minimale Größe von Zeilen auf Blattebene.The minimum leaf-level row size.

    Seiten Pages
    Gesamtanzahl der Datenseiten.The total number of data pages.

    Partitions-ID Partition 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.

Überprüfen der Indexfragmentierung mithilfe von Transact-SQLTransact-SQLCheck index fragmentation using Transact-SQLTransact-SQL

So überprüfen Sie die Fragmentierung eines Rowstore-IndexesTo check the fragmentation of a rowstore index

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.

So überprüfen Sie die Fragmentierung eines Columnstore-IndexesTo check the fragmentation of a columnstore index

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)

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.

Hinweis

Bei der Neuorganisation eines Columnstore-Indizes 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 alle Zeilengruppen zu komprimieren, verwenden Sie das unten angegebene Transact-SQLTransact-SQL-Beispiel.To compress all rowgroups, use the Transact-SQLTransact-SQL example below.

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.

Weitere InformationenSee Also

Leitfaden zur Architektur und zum Design von SQL Server-Indizes SQL Server Index Architecture and Design Guide
Ausführen von OnlineindexvorgängenPerform Index Operations Online
ALTER INDEX (Transact-SQL) ALTER INDEX (Transact-SQL)
Adaptive Indexdefragmentierung Adaptive Index Defrag
CREATE STATISTICS (Transact-SQL) CREATE STATISTICS (Transact-SQL)
UPDATE STATISTICS (Transact-SQL) UPDATE STATISTICS (Transact-SQL)
Abfrageleistung für Columnstore-Indizes Columnstore Indexes Query Performance
Erste Schritte mit Columnstore für operative Echtzeitanalyse Get started with Columnstore for real-time operational analytics
Columnstore-Indizes für Data Warehousing Columnstore Indexes for Data Warehousing
Columnstore-Indizes und Zusammenführungsrichtlinien für ZeilengruppenColumnstore indexes and the merge policy for rowgroups