Grad der Parallelität
SQL Server erkennt automatisch den am besten geeigneten Grad an Parallelität für jede Instanz einer parallelen Abfrageausführung oder eines DDL-Indizierungsvorgangs (Data Definition Language). Dazu werden die folgenden Kriterien untersucht:
Wird SQL Server auf einem Computer mit mehreren Mikroprozessoren (oder CPUs) ausgeführt wie z. B. auf einem symmetrischen Multiprozessorcomputer (Symmetric Multiprocessing, SMP)?
Nur Computer mit mehreren CPUs können parallele Abfragen verwenden.
Sind ausreichend Threads verfügbar?
Jeder Abfrage- oder Indexvorgang setzt zu seiner Ausführung eine bestimmte Anzahl von Threads voraus. Das Ausführen eines parallelen Plans erfordert mehr Threads als ein serieller Plan, und die Anzahl der erforderlichen Threads steigt mit dem Grad der Parallelität. Wenn die Threadanforderung des parallelen Plans für einen bestimmten Grad der Parallelität nicht erfüllt werden kann, reduziert Database Engine (Datenbankmodul) den Grad an Parallelität automatisch oder verwirft den parallelen Plan in dem angegebenen Arbeitsauslastungskontext. Stattdessen wird der serielle Plan (ein Thread) ausgeführt.
Welcher Abfragetyp oder Indexvorgangstyp soll ausgeführt werden?
Indexvorgänge, die einen Index erstellen oder neu erstellen oder einen gruppierten Index löschen, sowie Abfragen, die sehr viele CPU-Zyklen beanspruchen, eignen sich am besten für einen parallelen Plan. So sind z. B. Joins großer Tabellen, umfassende Aggregationen und Sortierungen großer Resultsets gut geeignet. Für einfache Abfragen, die häufig in transaktionsverarbeitenden Anwendungen eingesetzt werden, wird der zusätzliche Aufwand, der für die Koordinierung einer parallelen Abfrageausführung erforderlich ist, durch die erwartete Leistungssteigerung in der Regel nicht gerechtfertigt. Um zu ermitteln, für welche Abfragen die parallele Ausführung sinnvoll ist und für welche dies nicht gilt, vergleicht Database Engine (Datenbankmodul) die geschätzten Kosten für die Ausführung der Abfrage oder des Indexvorgangs mithilfe des cost threshold for parallelism-Werts. Mithilfe vonsp_configure können Benutzer den Standardwert 5 ändern; dies wird jedoch nicht empfohlen.
Gibt es eine ausreichende Anzahl von zu verarbeitenden Zeilen?
Wenn der Abfrageoptimierer ermittelt, dass die Anzahl der Zeilen zu niedrig ist, werden keine Verteilungsoperatoren eingesetzt, um die Zeilen zu verteilen. Demzufolge werden die Operatoren seriell ausgeführt. Durch das Ausführen der Operatoren in einem seriellen Plan werden Situationen vermieden, in denen die Kosten für Start, Verteilung und Koordinierung den Nutzen übersteigen, der durch die parallele Ausführung der Operatoren erzielt würde.
Sind aktuelle Verteilungsstatistiken verfügbar?
Wenn der höchste Grad der Parallelität nicht möglich ist, werden zunächst niedrigere Grade in Betracht gezogen, bevor der parallele Plan verworfen wird.
Wenn Sie z. B. einen gruppierten Index für eine Sicht erstellen, können die Statistiken nicht ausgewertet werden, weil der gruppierte Index noch nicht vorhanden ist. In diesem Fall kann Database Engine (Datenbankmodul) nicht den höchsten Grad der Parallelität für den Indexvorgang bereitstellen. Allerdings können einige Vorgänge, wie z. B. das Sortieren und Scannen, von der parallelen Ausführung profitieren.
Hinweis |
---|
Parallele Indexvorgänge sind nur in den Editionen SQL Server Enterprise, Developer und Evaluation verfügbar. |
Zur Ausführungszeit ermittelt Database Engine (Datenbankmodul), ob die aktuelle Systemlast und die oben beschriebenen Konfigurationsinformationen die parallele Ausführung zulassen. Wenn die parallele Ausführung gerechtfertigt ist, ermittelt Database Engine (Datenbankmodul) die optimale Anzahl von Threads und verteilt dann die Ausführung des parallelen Plans auf diese Threads. Wenn die parallele Ausführung eines Abfrage- oder Indexvorgangs mit mehreren Threads gestartet wird, wird dieselbe Anzahl an Threads bis zur Beendigung des Vorgangs verwendet. Database Engine (Datenbankmodul) bestimmt die optimale Anzahl von Threads jedes Mal neu, wenn ein Ausführungsplan aus dem Prozedurcache abgerufen wird. Bei einer Ausführung einer Abfrage könnte z. B. ein serieller Plan verwendet werden, bei einer späteren Ausführung derselben Abfrage ein paralleler Plan, der drei Threads verwendet, und bei der dritten Ausführung dieser Abfrage ein paralleler Plan, der vier Threads verwendet.
In einem parallelen Abfrageausführungsplan werden die Vorgänge zum Einfügen, Aktualisieren und Löschen seriell ausgeführt. Jedoch können die WHERE-Klausel einer UPDATE- oder einer DELETE-Anweisung oder der SELECT-Teil einer INSERT-Anweisung parallel ausgeführt werden. Die eigentlichen Datenänderungen werden anschließend seriell auf die Datenbank angewendet.
Statische Cursor und keysetgesteuerte Cursor können durch parallele Ausführungspläne aufgefüllt werden. Das spezifische Verhalten dynamischer Cursor kann jedoch nur durch die serielle Ausführung gewährleistet werden. Für eine Abfrage, die Teil eines dynamischen Cursors ist, generiert der Abfrageoptimierer immer einen seriellen Ausführungsplan.
Außer Kraft setzen der Grade der Parallelität
Mithilfe der Serverkonfigurationsoption max degree of parallelism kann die Anzahl der Prozessoren beschränkt werden, die bei der Ausführung paralleler Pläne verwendet werden. Die max degree of parallelism-Option kann jedoch für einzelne Abfrage- und Indexvorgangsanweisungen außer Kraft gesetzt werden, indem der MAXDOP-Abfragehinweis oder die MAXDOP-Indexoption angegeben wird. MAXDOP bietet mehr Kontrolle über einzelne Abfrage- und Indexvorgänge. Sie können z. B. die MAXDOP-Option verwenden, um durch Erweitern oder Reduzieren eine Steuerung der Anzahl der einem Onlineindexvorgang zugewiesenen Prozessoren zu bewirken. Auf diese Weise können Sie die Ressourcen, die von einem Indexvorgang verwendet werden, mit den Ressourcen gleichzeitiger Benutzer ausgleichen. Durch das Festlegen der Option max degree of parallelism auf 0 kann SQL Server bei der Ausführung paralleler Pläne alle verfügbaren Prozessoren bis maximal 64 Prozessoren verwenden. Ist MAXDOP für Abfragen und Indizes auf 0 festgelegt, kann SQL Server bei der Ausführung paralleler Pläne alle verfügbaren Prozessoren bis maximal 64 Prozessoren für diese Abfragen oder Indizes verwenden.