Freigeben über


Funktionsweise von Onlineindexvorgängen

In diesem Thema werden die Strukturen definiert, die während eines Onlineindexvorgangs vorhanden sind, und zeigt die Aktivitäten an, die diesen Strukturen zugeordnet sind.

Onlineindexstrukturen

Um gleichzeitige Benutzeraktivitäten während eines DDL-Vorgangs (Index Data Definition Language) zu ermöglichen, werden die folgenden Strukturen während des Onlineindexvorgangs verwendet: Quelle und bereits vorhandene Indizes, Ziel und zum Neuerstellen eines Heaps oder Ablegen eines gruppierten Indexes online, einem temporären Zuordnungsindex.

  • Quelle und bereits vorhandene Indizes

    Die Quelle ist die ursprüngliche Tabelle oder gruppierte Indexdaten. Bereits vorhandene Indizes sind alle nicht gruppierten Indizes, die der Quellstruktur zugeordnet sind. Wenn beispielsweise der Onlineindexvorgang einen gruppierten Index mit vier zugeordneten nicht gruppierten Indizes neu erstellt, ist die Quelle der vorhandene gruppierte Index, und die vorhandenen Indizes sind die nicht gruppierten Indizes.

    Die bereits vorhandenen Indizes sind für gleichzeitige Benutzer für Auswahl-, Einfüge-, Aktualisierungs- und Löschvorgänge verfügbar. Dazu gehören Masseneinfügungen (werden unterstützt, jedoch nicht empfohlen) und implizite Updates durch Trigger und referenzielle Integritätsbeschränkungen. Alle bereits vorhandenen Indizes sind für Abfragen und Suchvorgänge verfügbar. Dies bedeutet, dass sie vom Abfrageoptimierer ausgewählt und ggf. in Indexhinweisen angegeben werden.

  • Ziel

    Das Ziel oder die Ziele umfassen den neuen Index (oder Heap) oder eine Reihe neuer Indizes, die erstellt oder neu aufgebaut werden. Benutzer-Einfüge-, Aktualisierungs- und Löschvorgänge werden vom SQL Server-Datenbankmodul während des Indexvorgangs auf das Ziel angewendet. Wenn beispielsweise der Onlineindexvorgang einen gruppierten Index neu erstellt, ist das Ziel der neu erstellte gruppierte Index; Das Datenbankmodul erstellt keine nicht gruppierten Indizes neu, wenn ein gruppierter Index neu erstellt wird.

    Der Zielindex wird nicht abgefragt, während SELECT-Anweisungen verarbeitet werden, bis die Indexoperation abgeschlossen ist. Intern wird der Index als nur beschreibbar markiert.

  • Temporärer Zuordnungsindex

    Onlineindexvorgänge, die einen gruppierten Index erstellen, ablegen oder neu erstellen, erfordern auch einen temporären Zuordnungsindex. Dieser temporäre Index wird von gleichzeitigen Transaktionen verwendet, um zu bestimmen, welche Datensätze in den neuen Indizes gelöscht werden sollen, die erstellt werden, wenn Zeilen in der zugrunde liegenden Tabelle aktualisiert oder gelöscht werden. Dieser nicht gruppierte Index wird im selben Schritt wie der neue gruppierte Index (oder Heap) erstellt und erfordert keinen separaten Sortiervorgang. Gleichzeitige Transaktionen verwalten auch den temporären Zuordnungsindex in all ihren Einfüge-, Aktualisierungs- und Löschvorgängen.

Onlineindexaktivitäten

Während eines einfachen Onlineindexvorgangs, z. B. das Erstellen eines gruppierten Indexes in einer nicht indizierten Tabelle (Heap), durchlaufen die Quelle und das Ziel drei Phasen: Vorbereitung, Build und Final.

Die folgende Abbildung zeigt den Prozess zum Erstellen eines anfänglichen gruppierten Indexes online. Das Quellobjekt (der Heap) weist keine anderen Indizes auf. Die Quell- und Zielstrukturaktivitäten werden für jede Phase angezeigt; Gleichzeitige Benutzerauswahl-, Einfüge-, Aktualisierungs- und Löschvorgänge werden ebenfalls angezeigt. Die Vorbereitungs-, Build- und Endphasen werden zusammen mit den in jeder Phase verwendeten Sperrmodi angegeben.

Aktivitäten, die während des Onlineindexvorgangs durchgeführt werden

Quellstrukturaktivitäten

In der folgenden Tabelle sind die Aktivitäten aufgeführt, die die Quellstrukturen während jeder Phase des Indexvorgangs und der entsprechenden Sperrstrategie betreffen.

Phase Quellaktivität Quellsperren
Vorbereitung

Sehr kurze Phase
Systemmetadatenvorbereitung zum Erstellen der neuen leeren Indexstruktur.

Es wird eine Momentaufnahme der Tabelle erstellt. Das heißt, die Zeilenversionierung wird verwendet, um Lesekonsistenz auf Transaktionsebene zu gewährleisten.

Gleichzeitige Benutzerschreibvorgänge für die Quelle werden für einen sehr kurzen Zeitraum blockiert.

Es sind keine gleichzeitigen DDL-Vorgänge zulässig, außer mehrere nicht gruppierte Indizes zu erstellen.
S (Geteilt) in der Tabelle*

IS (Absicht geteilt)

INDEX_BUILD_INTERNAL_RESOURCE**
Bauen

Hauptphase
Die Daten werden in Massenladevorgängen gescannt, sortiert, zusammengeführt und in das Ziel eingefügt.

Gleichzeitige Benutzerauswahl-, Einfüge-, Aktualisierungs- und Löschvorgänge werden sowohl auf die vorhandenen Indizes als auch auf alle neuen Indizes angewendet, die erstellt werden.
IST

INDEX_BUILD_INTERNAL_RESOURCE**
Finale

Sehr kurze Phase
Alle nicht abgeschlossenen Updatetransaktionen müssen abgeschlossen werden, bevor diese Phase beginnt. Abhängig von der erworbenen Sperre werden alle neuen Benutzer-Lese- oder Schreibtransaktionen für einen sehr kurzen Zeitraum blockiert, bis diese Phase abgeschlossen ist.

Systemmetadaten werden aktualisiert, um die Quelle durch das Ziel zu ersetzen.

Die Quelle wird weggelassen, wenn sie nötig ist. Beispiel: Nach der Neuerstellung oder dem Ablegen eines gruppierten Indexes.
As this appears to be a technical term, leaving it untranslated is appropriate. No improvements are necessary. Therefore, the translation remains: INDEX_BUILD_INTERNAL_RESOURCE**

S in der Tabelle, wenn ein nicht gruppierter Index erstellt wird.*

SCH-M (Schemaänderung), wenn eine Quellstruktur (Index oder Tabelle) gelöscht wird.*

* Die Indexoperation wartet auf alle nicht abgeschlossenen Aktualisierungstransaktionen, bevor die S-Sperre oder die SCH-M-Sperre in der Tabelle erworben wird.

** Die Ressourcensperre INDEX_BUILD_INTERNAL_RESOURCE verhindert die Ausführung gleichzeitiger DDL-Vorgänge (Data Definition Language) für die Quelle und vorhandene Strukturen, während der Indexvorgang ausgeführt wird. Diese Sperre verhindert beispielsweise die gleichzeitige Neuerstellung von zwei Indizes in derselben Tabelle. Obwohl diese Ressourcensperre der Sch-M-Sperre zugeordnet ist, verhindert sie keine Datenmanipulationsanweisungen.

Die vorherige Tabelle zeigt eine einzelne geteilte (S)-Sperre, die während der Buildphase eines Onlineindexvorgangs erworben wurde, der einen einzelnen Index umfasst. Wenn gruppierte und nicht gruppierte Indizes erstellt oder neu erstellt werden, werden in einem einzelnen Onlineindexvorgang (z. B. während der anfänglichen Gruppierten Indexerstellung in einer Tabelle, die einen oder mehrere nicht gruppierte Indizes enthält) zwei kurzfristige S-Sperren während der Buildphase abgerufen, gefolgt von langfristigen Intent Shared (IS)-Sperren. Eine S-Sperre wird zuerst für die Gruppierte Indexerstellung abgerufen und beim Erstellen des gruppierten Indexes wird eine zweite kurzfristige S-Sperre zum Erstellen der nicht gruppierten Indizes abgerufen. Nachdem die nicht gruppierten Indizes erstellt wurden, wird die S-Sperre auf eine IS-Sperre herabgestuft, bis die letzte Phase des Onlineindexvorgangs abgeschlossen ist.

Zielstrukturaktivitäten

In der folgenden Tabelle sind die Aktivitäten aufgeführt, die die Zielstruktur in den jeweiligen Phasen des Indexvorgangs betreffen, sowie die entsprechende Sperrstrategie.

Phase Zielaktivität Zielsperren
Vorbereitung Neuer Index wird erstellt und auf nur-schreibbar festgelegt. IST
Bauen Daten werden aus der Quelle eingefügt.

Benutzeränderungen (Einfügungen, Aktualisierungen, Löschungen), die auf die Quelle angewendet werden, wurden durchgeführt.

Diese Aktivität ist für den Benutzer transparent.
IST
Finale Indexmetadaten werden aktualisiert.

Index ist auf Lese-/Schreibmodus eingestellt.
S

oder

SCH-M

SELECT-Anweisungen des Benutzers greifen erst auf das Ziel zu, wenn der Indexvorgang abgeschlossen ist.

Nach Abschluss der Vorbereitung und der endgültigen Phase werden die im Prozedurcache gespeicherten Abfrage- und Aktualisierungspläne ungültig. Nachfolgende Abfragen verwenden den neuen Index.

Die Lebensdauer eines Cursors, der für eine Tabelle deklariert ist, die an einem Onlineindexvorgang beteiligt ist, ist durch die Onlineindexphasen beschränkt. In jeder Phase werden Aktualisierungscursor ungültig gemacht. Schreibgeschützte Cursor werden erst nach der letzten Phase ungültig.

Ausführen von Onlineindexvorgängen

Richtlinien für Onlineindexvorgänge