Freigeben über


Richtlinien für Onlineindexvorgänge

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Für das Ausführen von Onlineindexvorgängen gelten die folgenden Richtlinien:

  • 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.

  • Nicht eindeutige, nicht gruppierte Indizes können online erstellt werden, wenn die Tabelle Spalten mit den LOB-Datentypen enthält, aber keine dieser Spalten in der Indexdefinition als Schlüssel- oder eingeschlossene Spalten verwendet werden.

  • Indizes für lokale temporäre Tabellen können online nicht erstellt, neu erstellt oder gelöscht werden. Diese Einschränkung gilt nicht für Indizes globaler temporärer Tabellen.

  • Sie können einen Onlineindexvorgang als reaktivierbaren Vorgang starten, indem Sie die RESUMABLE Klausel CREATE INDEX oder ALTER INDEX verwenden. Ein reaktivierbarer Indexvorgang kann nach einem unerwarteten Fehler, einem Datenbankfailover oder einem ALTER INDEX PAUSE Befehl neu gestartet und von dem Ort fortgesetzt werden, an dem er unterbrochen wurde.

Note

Onlineindexvorgänge sind nicht in jeder Edition von Microsoft SQL Server verfügbar. Eine Liste der Funktionen, die von den SQL Server-Editionen unterstützt werden, finden Sie unter Editionen und unterstützte Funktionen von SQL Server 2022.

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. Zusätzliche Einschränkungen werden ebenfalls aufgeführt.

Onlineindexvorgang Ausgeschlossene Indizes Weitere Einschränkungen
ALTER INDEX REBUILD Deaktivierter gruppierter Index oder deaktivierte indizierte Sicht

XML-Index

Index für eine lokale temp-Tabelle
Die Angabe des ALL-Schlüsselworts kann bewirken, dass die Operation einen Fehler erzeugt, wenn die Tabelle einen ausgeschlossenen Index enthält.

Weitere Einschränkungen zum Neuerstellen deaktivierter Indizes gelten ebenfalls. Weitere Informationen finden Sie unter Deaktivieren von Indizes und Einschränkungen.
CREATE INDEX XML-Index

Eindeutiger gruppierter Ausgangsindex für eine Sicht

Index für eine lokale temp-Tabelle
CREATE INDEX WITH DROP_EXISTING Deaktivierter gruppierter Index oder deaktivierte indizierte Sicht

Index für eine lokale temp-Tabelle

XML-Index
DROP INDEX Deaktivierter Index

XML-Index

Nicht gruppierter Index

Index für eine lokale temp-Tabelle
Es können nicht mehrere Indizes in einer einzigen Anweisung angegeben werden.
ALTER TABLE ADD CONSTRAINT (PRIMARY KEY oder UNIQUE) Index für eine lokale temp-Tabelle

Gruppierter Index
Es ist nur jeweils eine Unterklausel gleichzeitig zulässig. Sie können z. B. keine PRIMARY KEY- oder UNIQUE-Einschränkungen in derselben ALTER TABLE Anweisung hinzufügen und löschen.
ALTER TABLE DROP CONSTRAINT (PRIMARY KEY oder UNIQUE) Gruppierter Index

Die zugrunde liegende Tabelle kann nicht geändert, abgeschnitten oder verworfen werden, während ein Onlineindexvorgang ausgeführt wird.

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. Wenn der gruppierte Index CREATE INDEX WITH DROP_EXISTING, ONLINE = ON beispielsweise online erstellt wird, werden alle zugeordneten nicht gruppierte Indizes ebenfalls online neu erstellt.

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

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. In diesen seltenen Fällen wird die Benutzer- oder Anwendungsaktivität als Deadlock-Opfer ausgewählt.

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. Alle anderen gleichzeitig durchgeführten Onlineindexvorgänge erzeugen einen Fehler. Sie können z. B. keinen neuen Index online erstellen, während Sie einen vorhandenen Index für die gleiche Tabelle online neu erstellen.

Ein Onlinevorgang kann nicht ausgeführt werden, wenn ein Index eine Spalte des großen Objekttyps enthält und dieselbe Transaktion Datenänderungen vor dem Start des Onlineindexvorgangs vornimmt. Um dieses Problem zu umgehen, verschieben Sie den Onlineindexvorgang außerhalb der Transaktion, oder verschieben Sie ihn vor Datenänderungen in derselben Transaktion.

Überlegungen zum Speicherplatz auf dem Datenträger

Onlineindexvorgänge erfordern mehr Speicherplatz als Offlineindexvorgänge.

  • Beim Erstellen und Wiederherstellen von Indizes ist zusätzlicher Speicherplatz erforderlich, damit der Index erstellt (oder wiederhergestellt) werden kann. In der Regel entspricht dieser zusätzliche Platz dem aktuellen, vom Index belegten Speicherplatz, kann jedoch je nach komprimierung im aktuellen oder neu erstellten Index größer oder kleiner sein.

  • Darüber hinaus ist Speicherplatz für den temporären Zuordnungsindex erforderlich. Dieser temporäre Index wird in Onlineindexvorgängen verwendet, die einen gruppierten Index erstellen, neu erstellen oder löschen.

  • Das Löschen eines gruppierten Indexes online benötigt den gleichen Speicherplatz wie das Erstellen (oder Wiederherstellen) eines gruppierten Indexes online.

Weitere Informationen finden Sie unter Disk Space Requirements for Index DDL Operations.

Leistungsüberlegungen

Obwohl Onlineindexvorgänge gleichzeitige Benutzeraktualisierungsaktivitäten zulassen, können die Indexvorgänge länger dauern, wenn die Aktualisierungsaktivität stark ist. 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.

Da sowohl die Quell- als auch die Zielstrukturen während des Online-Indexvorgangs beibehalten werden, erhöht sich die Ressourcenauslastung für Einfüge-, Aktualisierungs- und Löschvorgänge, möglicherweise sogar verdoppelt. Dieser Vorgang kann einen Leistungsabfall und erhöhte Ressourcenverwendung (insbesondere CPU-Zeit) während des Indexvorgangs bewirken. Onlineindexvorgänge werden vollständig protokolliert.

In der Regel werden Onlinevorgänge empfohlen, Sie sollten jedoch Ihre Umgebung sowie besondere Anforderungen berücksichtigen. Es kann vorteilhafter sein, Indexvorgänge offline auszuführen. Dabei besitzen Benutzer während der Operation nur eingeschränkten Zugriff auf die Daten, der Vorgang wird jedoch schneller abgeschlossen und verwendet weniger Ressourcen.

Auf Multiprozessorcomputern, auf denen SQL Server 2016 (13.x) und höhere Versionen ausgeführt werden, können Indexvorgänge Parallelität verwenden, um die Überprüfungs- und Sortiervorgänge auszuführen, die der Index-Anweisung zugeordnet sind. Mit der MAXDOP Indexoption können Sie den Grad der Parallelität des Onlineindexvorgangs steuern. Auf diese Weise können Sie die Ressourcen, die vom Indexvorgang verwendet werden, mit den Ressourcen gleichzeitiger Benutzer ausgleichen. Weitere Informationen finden Sie unter Konfigurieren von parallelen Indexvorgängen. Weitere Informationen zu den Editionen von SQL Server, die parallele Indexvorgänge unterstützen, finden Sie unter Von den SQL Server 2022-Editionen unterstützte Funktionen.

Da eine freigegebene (S) Sperre oder eine Schemaänderungs-Sperre (Sch-M) in der letzten Phase des Indexvorgangs gehalten wird, seien Sie vorsichtig, wenn Sie einen Online-Indexvorgang innerhalb einer expliziten Benutzertransaktion, wie z. B. in einem BEGIN TRANSACTION ... COMMIT-Block, ausführen. Dadurch werden die Sperren bis zum Ende der Transaktion gehalten, wodurch möglicherweise andere Workloads blockiert werden.

Wenn Indexseitensperren mit ALLOW_PAGE_LOCKS = OFF deaktiviert sind, kann der Online-Index-Neuaufbau bei Ausführung mit MAXDOP größer als 1 die Indexfragmentierung erhöhen. Weitere Informationen finden Sie unter Vorgehensweise: Onlineneuerstellung von Indizes kann zu erhöhter Fragmentierung führen.

Überlegungen zum Transaktionsprotokoll

Umfangreiche Indexvorgänge, die offline oder online ausgeführt werden, können große Mengen an Transaktionsprotokollen generieren. Dies liegt daran, dass sowohl Offline- als auch Onlinevorgänge für die Neuerstellung von Indizes vollständig protokolliert werden. 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.

Aus diesem Grund muss das Transaktionsprotokoll während des Indexvorgangs genügend Speicherplatz zum Speichern der Transaktionen des Indexvorgangs sowie ggf. der gleichzeitigen Benutzertransaktionen aufweisen. Weitere Informationen finden Sie unter Transaction Log Disk Space for Index Operations.

Onlineindexvorgänge verursachen kein hohes Transaktionsprotokollwachstum, wenn die beschleunigte Datenbankwiederherstellung (ADR) aktiviert ist.

Überlegungen zum beständigen Versionsspeicher

Wenn ADR aktiviert ist, kann das Erstellen oder Neuerstellen eines großen Indexes online die Größe des permanenten Versionsspeichers (PVS) erheblich erhöhen, während der Indexvorgang ausgeführt wird. Stellen Sie sicher, dass die Datenbank über ausreichend freien Speicherplatz verfügt, damit PVS wachsen kann. Weitere Informationen finden Sie unter Überwachung und Fehlerbehebung bei der beschleunigten Datenbankwiederherstellung.

Überlegungen zu fortsetzbaren Indizes

Die RESUMABLE Indexoption für CREATE INDEXALTER INDEX SQL Server (ALTER INDEX ab SQL Server 2017 (14.x) und CREATE INDEX ab SQL Server 2019 (15.x)), Azure SQL-Datenbank und Azure SQL Managed Instance. Weitere Informationen finden Sie unter CREATE INDEX und ALTER INDEX.

Um die RESUMABLE Option zu verwenden, müssen Sie auch die ONLINE Option verwenden. Wenn Sie den reaktivierbaren Index erstellen oder neu erstellen, gelten die folgenden Richtlinien:

  • Sie haben mehr Kontrolle über das Verwalten, Planen und Erweitern der Indexwartungszeitfenster. Sie können einen Vorgang zur Indexerstellung oder -neuerstellung mehrmals anhalten und neu starten, um Ihre Wartungsfenster anzupassen.

  • Sie können Probleme beim Erstellen oder Neuerstellen von Indexen (z. B. bei Datenbankübertragungen oder Speichermangel) lösen, ohne den Indexvorgang von Anfang an neu starten zu müssen.

  • 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.

  • Die SORT_IN_TEMPDB = ON-Option wird nicht unterstützt.

  • Deaktivierte Indizes werden nicht unterstützt.

Tip

Für reaktivierbare Indexvorgänge ist keine große Transaktion erforderlich, sodass häufige Protokollabkürzungen während dieses Vorgangs möglich sind und ein großes Protokollwachstum vermieden wird. Die zum Fortsetzen und Abschließen eines Indexvorgangs erforderlichen Daten werden in den Datendateien einer Datenbank gespeichert.

Im Allgemeinen gibt es keinen Leistungsunterschied zwischen resumablen und nicht umsetzbaren Onlineindexvorgängen. Für die Wiederaufnahme CREATE INDEX gibt es einen konstanten Overhead, der zu deutlich langsameren Vorgängen für kleinere Tabellen führen kann.

Wenn ein reaktivierbarer Indexvorgang angehalten wird:

  • Bei meist gelesenen Arbeitslasten ist die Leistungsbeeinträchtigung unbedeutend.
  • Bei updatelastigen Workloads kann es je nach Workloadspezifischen zu einer Durchsatzverschlechterung kommen.

Im Allgemeinen besteht kein Unterschied bei der Defragmentierungsqualität zwischen der Erstellung oder Neuerstellung von fortsetzbaren und nicht fortsetzbaren Onlineindizes.

Während ein Onlineindexvorgang angehalten wird, schlägt jede Transaktion, die eine exklusive (X) Sperrung auf Tabellenebene für die Tabelle erfordert, die den angehaltenen Index enthält, fehl. Dies kann z. B. bei INSERT ... WITH (TABLOCK) Operationen auftreten. In diesem Fall erhalten Sie den Fehler 10637:

Cannot perform this operation on '<object name>' with ID (<object ID>) as one or more indexes are currently in resumable index rebuild state. Please refer to sys.index_resumable_operations for more details.

Um Fehler 10637 zu beheben, entfernen Sie den TABLOCK-Hinweis aus Ihrer Transaktion, oder heben Sie die Unterbrechung der Index-Operation auf, und warten Sie, bis sie abgeschlossen ist, bevor Sie die Transaktion erneut versuchen.

Standardonlineoptionen

Sie können Online- und reaktivierbare Indexvorgänge als Standardoptionen auf Datenbankebene festlegen, indem Sie die ELEVATE_ONLINE Konfigurationen oder ELEVATE_RESUMABLE die Datenbankbereichskonfigurationen festlegen. Mit diesen Standardoptionen können Sie vermeiden, dass versehentlich ein Offlineindexvorgang gestartet wird, auf den eine Tabelle oder ein Index während der Ausführung nicht zugegriffen werden kann. Beide Optionen führen dazu, dass das Datenbankmodul bestimmte Indexvorgänge automatisch auf online oder reaktivierbare Ausführung erhöht.

Sie können die Option entweder als FAIL_UNSUPPORTED, WHEN_SUPPORTED, oder OFF. Sie können unterschiedliche Werte für ELEVATE_ONLINE und ELEVATE_RESUMABLE festlegen. Weitere Informationen finden Sie unter ALTER DATABASE SCOPED CONFIGURATION.

Sowohl ELEVATE_ONLINE als auch ELEVATE_RESUMABLE gelten nur für DDL-Anweisungen, die die Syntax für online bzw. fortsetzbar unterstützen. Wenn Sie beispielsweise versuchen, einen XML-Index mit ELEVATE_ONLINE = FAIL_UNSUPPORTEDzu erstellen, wird der Vorgang offline ausgeführt, da XML-Indizes die ONLINE Option nicht unterstützen. Die Optionen wirken sich nur auf DDL-Anweisungen aus, die ohne Angabe einer ONLINERESUMABLE Option übermittelt werden. 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.

Note

ELEVATE_ONLINE und ELEVATE_RESUMABLE gelten nicht für XML-Index-Operationen.