Freigeben über


Parallele Indexvorgänge

Die für das Erstellen oder Neuerstellen eines Indexes bzw. für das Löschen eines gruppierten Indexes erstellten Abfragepläne ermöglichen parallele Multithreaded Vorgänge auf Computern, die über mehrere Mikroprozessoren verfügen.

HinweisHinweis

Parallele Indexvorgänge sind nur in SQL Server 2008 Enterprise verfügbar.

SQL Server verwendet die gleichen Algorithmen wie bei anderen Abfragen, um den Grad an Parallelität (die Gesamtzahl der separaten Threads, die ausgeführt werden sollen) für Indexvorgänge zu ermitteln. Der maximale Grad an Parallelität für einen Indexvorgang hängt von der Serverkonfigurationsoption Max. Grad an Parallelität ab. Der Wert Max. Grad an Parallelität kann für einzelne Indexvorgänge außer Kraft gesetzt werden; legen Sie hierzu die Indexoption MAXDOP in der Anweisung CREATE INDEX, ALTER INDEX, DROP INDEX und ALTER TABLE fest.

Wenn Database Engine (Datenbankmodul) einen Indexausführungsplan erstellt, wird die Anzahl der parallelen Vorgänge auf den niedrigsten der folgenden Werte festgelegt:

  • Die Anzahl der Mikroprozessoren (oder CPUs) des Computers.

  • Die in der Serverkonfigurationsoption Max. Grad an Parallelität angegebene Anzahl.

  • Die Anzahl der CPUs, die nicht bereits einen Schwellenwert an Arbeit überschritten haben, die für SQL Server-Threads durchgeführt wird.

Auf einem Computer mit acht CPUs und einem Wert für Max. Grad an Parallelität in Höhe von 6 werden z. B. maximal sechs parallele Threads für einen Indexvorgang generiert. Falls fünf der CPUs in dem Computer bereits den Schwellenwert von SQL Server-Arbeit überschritten haben, wenn ein Indexausführungsplan erstellt wird, legt der Ausführungsplan nur drei parallele Threads fest.

Die Hauptphasen eines parallelen Indexvorgangs umfassen Folgendes:

  • Ein koordinierender Thread scannt die Tabelle schnell und nach dem Zufallsprinzip, um die Verteilung der Indexschlüssel einzuschätzen. Der koordinierende Thread legt die Schlüsselgrenzen fest, die eine Reihe von Schlüsselbereichen erstellen, die dem Grad an parallelen Vorgängen entsprechen, wobei jeder Schlüsselbereich so geschätzt wird, dass eine ähnlich große Anzahl von Zeilen abgedeckt ist. Wenn z. B. vier Millionen Zeilen in einer Tabelle vorhanden sind und der Grad an Parallelität 4 beträgt, bestimmt der koordinierende Thread die Schlüsselwerte, die vier Zeilengruppen mit je einer Million Zeilen in jeder Gruppe trennen. Wenn nicht genügend Schlüsselbereiche für die Verwendung aller CPUs eingerichtet werden können, wird der Grad an Parallelität entsprechend verringert.

  • Der koordinierende Thread verteilt eine Reihe von Threads, die dem Grad an parallelen Vorgängen entsprechen, und wartet, dass diese Threads ihre Arbeit beenden. Jeder Thread scannt die Basistabelle mithilfe eines Filters, der nur Zeilen mit Schlüsselwerten in dem Bereich abruft, der dem Thread zugewiesen ist. Jeder Thread erstellt eine Indexstruktur für die Zeilen in seinem Schlüsselbereich. Bei einem partitionierten Index erstellt jeder Thread eine angegebene Anzahl an Partitionen. Partitionen werden nicht für Threads freigegeben. Weitere Informationen zum Erstellen eines Indexes finden Sie unter tempdb und Indexerstellung.

  • Nachdem alle parallelen Threads abgeschlossen sind, verbindet der koordinierende Thread die Untereinheiten des Indexes zu einem einzelnen Index. Diese Phase gilt nur für Offline-Indexvorgänge.

Einzelne CREATE TABLE- oder ALTER TABLE-Anweisungen können über mehrere Einschränkungen verfügen, die die Erstellung eines Indexes erforderlich machen. Diese mehrfachen Indexerstellungsvorgänge werden seriell durchgeführt, obwohl jeder einzelne Indexerstellungsvorgang auf einem Computer mit mehreren CPUs als paralleler Vorgang ausgeführt werden kann.