Richtlinien für OnlineindexvorgängeGuidelines for online index operations

GILT FÜR: jaSQL ServerjaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Für das Ausführen von Onlineindexvorgängen gelten die folgenden Richtlinien:When you perform online index operations, the following guidelines apply:

  • Gruppierte Indizes müssen offline erstellt, neu erstellt oder gelöscht werden, wenn die zugrunde liegende Tabelle die folgenden LOB-Datentypen (Large Object) enthält: image, ntextund text.Clustered indexes must be created, rebuilt, or dropped offline when the underlying table contains the following large object (LOB) data types: image, ntext, and text.
  • Nicht eindeutige, nicht gruppierte Indizes können online erstellt werden, wenn die Tabelle LOB-Datentypen enthält, keine dieser Spalten jedoch in der Indexdefinition als Schlüssel- oder Nichtschlüsselspalte (eingeschlossene Spalte) verwendet wird.Nonunique nonclustered indexes can be created online when the table contains LOB data types but none of these columns are used in the index definition as either key or nonkey (included) columns.
  • Indizes für lokale temp-Tabellen können nicht online erstellt, neu erstellt oder gelöscht werden.Indexes on local temp tables cannot be created, rebuilt, or dropped online. Diese Einschränkung gilt nicht für Indizes globaler temporärer Tabellen.This restriction does not apply to indexes on global temp tables.
  • Indizes können von dort fortgesetzt werden, wo nach einem unerwarteten Fehler, einem Datenbank-Failover oder einem PAUSE-Befehl angehalten wurde.Indexes can be resumed from where it stopped after an unexpected failure, database failover, or a PAUSE command. Weitere Informationen finden Sie unter Indexerstellung und Alter Index.See Create Index and Alter Index.

Hinweis

Onlineindexvorgänge sind nicht in jeder Edition von MicrosoftMicrosoft SQL ServerSQL Serververfügbar.Online index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. Eine Liste der Funktionen, die von den SQL ServerSQL Server-Editionen unterstützt werden, finden Sie unter Von den Editionen unterstützte Funktionen.For a list of features that are supported by the editions of SQL ServerSQL Server, see Features supported by editions.

Die folgende Tabelle enthält eine Auflistung der Indexvorgänge, die online ausgeführt werden können, der Indizes, die von diesen Onlinevorgängen ausgeschlossen sind und fortsetzbaren Indexrestriktionen.The following table shows the index operations that can be performed online, the indexes that are excluded from these online operations, and resumable index restrictions. Zusätzliche Einschränkungen werden ebenfalls aufgeführt.Additional restrictions are also included.

OnlineindexvorgangOnline index operation Ausgeschlossene IndizesExcluded indexes Andere EinschränkungenOther restrictions
ALTER INDEX REBUILDALTER INDEX REBUILD Deaktivierter gruppierter Index oder deaktivierte indizierte SichtDisabled clustered index or disabled indexed view

XML-IndexXML index

Columnstore-IndexColumnstore index

Index für eine lokale temp-TabelleIndex on a local temp table
Die Angabe des ALL-SchlüsselwOrts kann bewirken, dass die Operation einen Fehler erzeugt, wenn die Tabelle einen ausgeschlossenen Index enthält.Specifying the keyword ALL may cause the operation to fail when the table contains an excluded index.

Weitere Einschränkungen zum Neuerstellen deaktivierter Indizes gelten ebenfalls.Additional restrictions on rebuilding disabled indexes apply. Weitere Informationen finden Sie unter Deaktivieren von Indizes und Einschränkungen.For more information, see Disable Indexes and Constraints.
CREATE INDEXCREATE INDEX XML-IndexXML index

Eindeutiger gruppierter Ausgangsindex für eine SichtInitial unique clustered index on a view

Index für eine lokale temp-TabelleIndex on a local temp table
CREATE INDEX WITH DROP_EXISTINGCREATE INDEX WITH DROP_EXISTING Deaktivierter gruppierter Index oder deaktivierte indizierte SichtDisabled clustered index or disabled indexed view

Index für eine lokale temp-TabelleIndex on a local temp table

XML-IndexXML index
DROP INDEXDROP INDEX Deaktivierter IndexDisabled index

XML-IndexXML index

Nicht gruppierter IndexNonclustered index

Index für eine lokale temp-TabelleIndex on a local temp table
Es können nicht mehrere Indizes in einer einzigen Anweisung angegeben werden.Multiple indexes cannot be specified within a single statement.
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY oder UNIQUE)ALTER TABLE ADD CONSTRAINT (PRIMARY KEY or UNIQUE) Index für eine lokale temp-TabelleIndex on a local temp table

Gruppierter IndexClustered index
Es ist nur jeweils eine Unterklausel gleichzeitig zulässig.Only one subclause is allowed at a time. Sie können z. B. PRIMARY KEY- oder UNIQUE-Einschränkungen nicht in der gleichen ALTER TABLE-Anweisung hinzufügen oder löschen.For example, you cannot add and drop PRIMARY KEY or UNIQUE constraints in the same ALTER TABLE statement.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY oder UNIQUE)ALTER TABLE DROP CONSTRAINT (PRIMARY KEY or UNIQUE) Gruppierter IndexClustered index

Die zugrunde liegende Tabelle kann nicht geändert, abgeschnitten oder gelöscht werden, während ein Onlineindexvorgang ausgeführt wird.The underlying table cannot be modified, truncated, or dropped while an online index operation is in process.

Die beim Erstellen oder Löschen eines gruppierten Indexes angegebene Einstellung für die Onlineoption (ON oder OFF) wird auf alle nicht gruppierten Indizes angewendet, die neu erstellt werden müssen.The online option setting (ON or OFF) specified when you create or drop a clustered index is applied to any nonclustered indexes that must be rebuilt. Wenn der gruppierte Index z. B. online mithilfe von CREATE INDEX WITH DROP_EXISTING, ONLINE=ON erstellt wird, werden alle zugeordneten nicht gruppierten Indizes ebenfalls online neu erstellt.For example, if the clustered index is built online by using CREATE INDEX WITH DROP_EXISTING, ONLINE=ON, all associated nonclustered indexes are re-created online also.

Wenn Sie einen UNIQUE-Index online erstellen oder neu erstellen, versuchen die Indexerstellung und eine gleichzeitige Benutzertransaktion möglicherweise, den gleichen Schlüssel einzufügen. Dies verletzt die Eindeutigkeit.When you create or rebuild a UNIQUE index online, the index builder and a concurrent user transaction may try to insert the same key, therefore violating uniqueness. Wenn eine von einem Benutzer in den neuen Index (Ziel) eingegebene Zeile eingefügt wird, bevor die ursprüngliche Zeile aus der Quelltabelle in den neuen Index verschoben wird, schlägt der Onlineindexvorgang fehl.If a row entered by a user is inserted into the new index (target) before the original row from the source table is moved to the new index, the online index operation will fail.

Obwohl der Fall nicht häufig auftritt, kann der Onlineindexvorgang aufgrund von Benutzer- oder Anwendungsaktivitäten einen Deadlock bewirken, wenn sie mit den Datenbankupdates interagiert.Although not common, the online index operation can cause a deadlock when it interacts with database updates because of user or application activities. In diesen seltenen Fällen wählt SQL Server-Datenbank-EngineSQL Server Database Engine die Benutzer- oder Anwendungsaktivität als Deadlockopfer aus.In these rare cases, the SQL Server-Datenbank-EngineSQL Server Database Engine will select the user or application activity as a deadlock victim.

Sie können gleichzeitige Onlineindex-DDL-Operationen für die gleiche Tabelle oder Sicht nur dann ausführen, wenn Sie mehrere neue, nicht gruppierte Indizes erstellen oder nicht gruppierte Indizes neu organisieren.You can perform concurrent online index DDL operations on the same table or view only when you are creating multiple new nonclustered indexes, or reorganizing nonclustered indexes. Alle anderen gleichzeitig durchgeführten Onlineindexvorgänge erzeugen einen Fehler.All other online index operations performed at the same time fail. Sie können z. B. keinen neuen Index online erstellen, während Sie einen vorhandenen Index für die gleiche Tabelle online neu erstellen.For example, you cannot create a new index online while rebuilding an existing index online on the same table.

Ein Onlinevorgang kann nicht ausgeführt werden, wenn ein Index eine Spalte des Datentyps für große Objekte enthält und wenn dieselbe Transaktion vor diesem Onlinevorgang Updatevorgänge enthält.An online operation cannot be performed when an index contains a column of the large object type, and in the same transaction there are update operations before this online operation. Um dieses Problem zu umgehen, platzieren Sie den Onlinevorgang außerhalb der Transaktion oder vor den Updates in der Transaktion.To work around this issue, place the online operation outside the transaction or place it before any updates in the transaction.

Überlegungen zum Speicherplatz auf dem DatenträgerDisk space considerations

Onlineindexvorgänge erfordern mehr Speicherplatz als Offlineindexvorgänge.Online index operations require more disk space requirements than offline index operations.

  • Beim Erstellen und Wiederherstellen von Indizes ist zusätzlicher Speicherplatz erforderlich, damit der Index erstellt (oder wiederhergestellt) werden kann.During index creation and index rebuild operations, additional space is required for the index being built (or rebuilt).
  • Darüber hinaus ist Speicherplatz für den temporären Zuordnungsindex erforderlich.In addition, disk space is required for the temporary mapping index. Dieser temporäre Index wird in Onlineindexvorgängen verwendet, die einen gruppierten Index erstellen, neu erstellen oder löschen.This temporary index is used in online index operations that create, rebuild, or drop a clustered index.
  • Das Löschen eines gruppierten Indexes online benötigt den gleichen Speicherplatz wie das Erstellen (oder Wiederherstellen) eines gruppierten Indexes online.Dropping a clustered index online requires as much space as creating (or rebuilding) a clustered index online.

Weitere Informationen finden Sie unter Disk Space Requirements for Index DDL Operations.For more information, see Disk Space Requirements for Index DDL Operations.

Überlegungen zur LeistungPerformance considerations

Zwar ermöglichen Onlineindexvorgänge gleichzeitige Benutzerupdateaktivitäten, die Indexvorgänge benötigen jedoch mehr Zeit, wenn die Updateaktivitäten umfangreich sind.Although online index operations permit concurrent user update activity, the index operations will take longer if the update activity is very heavy. In der Regel sind Onlineindexvorgänge langsamer als die entsprechenden Offlineindexvorgänge, und zwar unabhängig davon, in welchem Umfang gleichzeitige Updateaktivitäten ausgeführt werden.Typically, online index operations will be slower than equivalent offline index operations regardless of the concurrent update activity level.

Da sowohl die Quell- als auch die Zielstrukturen während des Onlineindexvorgangs verwaltet werden, kann die Ressourcenverwendung für Einfüge-, Update- und Löschtransaktionen bis um das Doppelte zunehmen.Because both the source and target structures are maintained during the online index operation, the resource usage for insert, update, and delete transactions is increased, potentially up to double. Dieser Vorgang kann einen Leistungsabfall und erhöhte Ressourcenverwendung (insbesondere CPU-Zeit) während des Indexvorgangs bewirken.This could cause a decrease in performance and greater resource usage, especially CPU time, during the index operation. Onlineindexvorgänge werden vollständig protokolliert.Online index operations are fully logged.

In der Regel werden Onlinevorgänge empfohlen, Sie sollten jedoch Ihre Umgebung sowie besondere Anforderungen berücksichtigen.Although we recommend online operations, you should evaluate your environment and specific requirements. Es kann vorteilhafter sein, Indexvorgänge offline auszuführen.It may be optimal to run index operations offline. Dabei besitzen Benutzer während der Operation nur eingeschränkten Zugriff auf die Daten, der Vorgang wird jedoch schneller abgeschlossen und verwendet weniger Ressourcen.In doing this, users have restricted access to the data during the operation, but the operation finishes faster and uses fewer resources.

Auf Mehrprozessorcomputern, auf denen SQL Server 2016 ausgeführt wird, verwenden Indexanweisungen möglicherweise mehrere Prozessoren, um die Scan- und Sortiervorgänge auszuführen, die mit der Indexanweisung verknüpft sind, genau so, wie andere Abfragen dies tun.On multiprocessor computers that are running SQL Server 2016, index statements may use more processors to perform the scan and sort operations associated with the index statement just like other queries do. Sie können die MAXDOP-Indexoption verwenden, um die Anzahl der Prozessoren für den Onlineindexvorgang zu steuern.You can use the MAXDOP index option to control the number of processors dedicated to the online index operation. Auf diese Weise können Sie die Ressourcen, die vom Indexvorgang verwendet werden, mit den Ressourcen gleichzeitiger Benutzer ausgleichen.In this way, you can balance the resources that are used by index operation with those of the concurrent users. Weitere Informationen finden Sie unter Konfigurieren von Parallelindexvorgängen.For more information, see Configure Parallel Index Operations. Weitere Informationen zu den Editionen von SQL Server, die parallele Indexvorgänge unterstützen, finden Sie unter Von den Editionen unterstützte Funktionen.For more information about the editions of SQL Server that support Parallel indexed operations, see Features Supported by editions.

Da eine Sperre des Typs S- oder Sch-M in der Abschlussphase des Indexvorgangs aktiviert wird, sollten Sie Vorsicht walten lassen, wenn Sie einen Onlineindexvorgang innerhalb einer expliziten Benutzertransaktion ausführen, z. B. in einem BEGIN TRANSACTION...COMMIT-Block.Because an S-lock or Sch-M lock is held in the final phase of the index operation, be careful when you run an online index operation inside an explicit user transaction, such as BEGIN TRANSACTION...COMMIT block. In diesem Fall bleibt die Sperre aktiviert, bis die Transaktion beendet ist, und beeinträchtigt daher die Benutzerparallelität.Doing this causes the lock to be held until the end of the transaction, therefore impeding user concurrency.

Die Onlineneuerstellung von Indizes kann die Fragmentierung erhöhen, wenn diese für die MAX DOP > 1 -Option und die ALLOW_PAGE_LOCKS = OFF -Option aktiviert ist.Online index rebuilding may increase fragmentation when it is allowed to run with MAX DOP > 1 and ALLOW_PAGE_LOCKS = OFF options. Weitere Informationen finden Sie unter How It Works: Online Index Rebuild (Onlineneuerstellung von Indizes) – kann zu erhöhter Fragmentierung führen.For more information, see How It Works: Online Index Rebuild - Can Cause Increased Fragmentation.

Überlegungen zum TransaktionsprotokollTransaction log considerations

Umfangreiche Indexvorgänge, die offline oder online ausgeführt werden, können große Datenlasten generieren, die das Transaktionsprotokoll schnell füllen können.Large-scale index operations, performed offline or online, can generate large data loads that can cause the transaction log to quickly fill. Damit sichergestellt wird, dass für den Indexvorgang ein Rollback ausgeführt werden kann, kann das Transaktionsprotokoll erst abgeschnitten werden, nachdem der Indexvorgang abgeschlossen wurde; das Protokoll kann jedoch während des Indexvorgangs gesichert werden.To make sure that the index operation can be rolled back, the transaction log cannot be truncated until the index operation has been completed; however, the log can be backed up during the index operation. Aus diesem Grund muss das Transaktionsprotokoll für die Dauer des Indexvorgangs genügend Speicherplatz zum Speichern der Transaktionen des Indexvorgangs sowie ggf. der gleichzeitigen Benutzertransaktionen aufweisen.Therefore, the transaction log must have sufficient space to store both the index operation transactions and any concurrent user transactions for the duration of the index operation. Weitere Informationen finden Sie unter Transaction Log Disk Space for Index Operations.For more information, see Transaction Log Disk Space for Index Operations.

Überlegungen zu fortsetzbaren IndizesResumable index considerations

Hinweis

Die Option für fortsetzbare Indizes gilt für SQL Server (ab SQL Server 2017) (nur die Indexneuerstellung) und SQL-Datenbank (Erstellung von Indizes und Indexneuerstellung).The resumable index option applies to SQL Server (Starting with SQL Server 2017) (index rebuild only) and SQL Database (create index and index rebuild). Weitere Informationen finden Sie unter Indexerstellung (derzeit nur in der öffentlichen Vorschauversion für SQL Server 2019SQL Server 2019) und Alter Index.See Create Index (currently in public preview for SQL Server 2019SQL Server 2019) and Alter Index.

Für die Erstellung oder Neuerstellung von fortsetzbaren Onlineindizes gelten die folgenden Richtlinien:When you perform resumable online index create or rebuild, the following guidelines apply:

  • Verwalten, Planen und Erweitern von Indexwartungsfenstern.Managing, planning and extending of index maintenance windows. Sie können einen Vorgang zur Indexerstellung oder -neuerstellung mehrmals anhalten und neu starten, um Ihre Wartungsfenster anzupassen.You can pause and restart an index create or rebuild operation multiple times to fit your maintenance windows.
  • Wiederherstellen nach Fehlern bei der Indexerstellung oder -neuerstellung (z.B. Datenbankfailover oder wenn kein Speicherplatz auf dem Datenträger mehr verfügbar war).Recovering from index create or rebuild failures (such as database failovers or running out of disk space).
  • Wenn ein Indexvorgang angehalten wird, wird sowohl für den ursprünglichen Index als auch für den neu erstellten Index Speicherplatz benötigt, und beide müssen während des DML-Vorgangs aktualisiert werden.When an index operation is paused, both the original index and the newly created one require disk space and need to be updated during DML operations.
  • Ermöglicht das Abschneiden von Transaktionsprotokollen während des Vorgangs einer Indexerstellung oder -neuerstellung.Enables truncation of transaction logs during an index create or rebuild operation.
  • Die Option SORT_IN_TEMPDB=ON wird nicht unterstützt.SORT_IN_TEMPDB=ON option is not supported

Wichtig

Für die Erstellung oder Neuerstellung fortsetzbarer Indizes muss keine Transaktion mit langer Ausführungsdauer geöffnet bleiben. Deswegen kann das Protokoll während dieses Vorgangs abgeschnitten werden, was eine bessere Verwaltung des Protokollspeicherplatzes gestattet.Resumable index create or rebuild does not require you to keep open a long running transaction, allowing log truncation during this operation and a better log space management. Mit dem neuen Entwurf haben wir es geschafft, dass notwendige Daten zusammen mit allen erforderlichen Verweisen für den Neustart des fortsetzbaren Vorgangs in einer Datenbank gehalten werden.With the new design, we managed to keep necessary data in a database together with all references required to restart the resumable operation.

Im Allgemeinen besteht kein Leistungsunterschied zwischen fortsetzbaren und nicht fortsetzbaren Neuerstellungen von Onlineindizes.Generally, there is no performance difference between resumable and non-resumable online index rebuild. Für die Erstellung von fortsetzbaren Indizes fällt fortwährend Mehraufwand an, weshalb ein geringfügiger Leistungsunterschied zwischen der Erstellung von fortsetzbaren und nicht fortsetzbaren Indizes besteht.For create resumable index, there is a constant overhead that causes a small performance difference between resumable and non-resumable index create. Dieser Unterschied ist in erster Linie nur bei kleineren Tabellen spürbar.This difference is mostly noticeable only for smaller tables.

Wenn Sie einen fortsetzbaren Index aktualisieren, während ein Indexvorgang angehalten ist, gilt Folgendes:When you update a resumable index while an index operation is paused:

  • Bei Arbeitsauslastungen, die meistens nur gelesen werden, ist die Leistungsauswirkung unbedeutend.For read-mostly workloads, the performance impact is insignificant.
  • Bei Arbeitsauslastungen, die oft aktualisiert werden, tritt möglicherweise eine Minderung des Durchsatzes auf (bei unseren Tests ergab sich eine Minderung von unter 10%).For update-heavy workloads, you may experience some throughput degradation (our testing shows less than 10% degradation).

Im Allgemeinen besteht kein Unterschied bei der Defragmentierungsqualität zwischen der Erstellung oder Neuerstellung von fortsetzbaren und nicht fortsetzbaren Onlineindizes.Generally, there is no difference in defragmentation quality between resumable and non-resumable online index create or rebuild.

StandardonlineoptionenOnline default options

Wichtig

Diese Optionen befinden sich in der öffentlichen Vorschau für SQL Server 2019SQL Server 2019.These options are in public preview for SQL Server 2019SQL Server 2019.

Sie können Standardoptionen für online oder fortsetzbar auf Datenbankebene festlegen, indem Sie die datenbankbezogenen Konfigurationsoptionen ELEVATE_ONLINE und ELEVATE_RESUMABLE festlegen.You can set default options for online or resumable at a database level by setting the ELEVATE_ONLINE or ELEVATE_RESUMABLE database scoped configuration options. Mit diesen Standardoptionen können Sie versehentliches Ausführen eines Vorgangs verhindern, der die Datenbanktabelle offline schalten würde.With these default options, you can avoid accidentally performing an operation that takes your database table offline. Beide Optionen bewirken, dass die Engine bestimmte Vorgänge automatisch in Online- oder fortsetzbare Ausführung erhöht.Both options will cause the engine to automatically elevate certain operations to online or resumable execution.
Sie können die Option über den Befehl ALTER DATABASE SCOPED CONFIGURATION entweder auf FAIL_UNSUPPORTED, WHEN_SUPPORTED oder OFF festlegen.You can set either option as FAIL_UNSUPPORTED, WHEN_SUPPORTED, or OFF using the ALTER DATABASE SCOPED CONFIGURATION command. Sie können verschiedene Werte für online und fortsetzbar festlegen.You can set different values for online and resumable.

Sowohl ELEVATE_ONLINE als auch ELEVATE_RESUMABLE gelten nur für DDL-Anweisungen, die die Syntax für online bzw. fortsetzbar unterstützen.Both ELEVATE_ONLINE and ELEVATE_RESUMABLE only apply to DDL statements that support the online and resumable syntax respectively. Wenn Sie beispielsweise versuchen, einen XML-Index mit ELEVATE_ONLINE = FAIL_UNSUPORTED zu erstellen, wird der Vorgang offline ausgeführt, weil die ONLINE =-Syntax nicht für XML-Indizes unterstützt wird.For example, if you attempt to create an XML index with ELEVATE_ONLINE=FAIL_UNSUPORTED, the operation will run offline since XML indexes don't support the ONLINE= syntax. Die Optionen wirken sich nur auf DDL-Anweisungen aus, die ohne Angabe einer ONLINE- oder RESUMABLE-Option gesendet werden.The options only effect DDL statements that are submitted without specifying an ONLINE or RESUMABLE option. Wird z. B. eine Anweisung ONLINE=OFF oder RESUMABLE=OFF gesendet, kann der Benutzer eine FAIL_UNSUPPORTED-Einstellung außer Kraft setzen und eine Anweisung offline und/oder nicht fortsetzbar ausführen.For example, by submitting a statement with ONLINE=OFF or RESUMABLE=OFF, the user can override a FAIL_UNSUPPORTED setting and run a statement offline and/or non-resumably.

Hinweis

ELEVATE_ONLINE und ELEVATE_RESUMABLE gelten nicht für XML-Indexvorgänge.ELEVATE_ONLINE and ELEVATE_RESUMABLE does not apply to XML index operations.