MAXDOP = 1, Abfragehinweise und Kostenschwelle für Parallelität

11

Wenn eine Instanz MAXDOPauf 1 gesetzt wurde und Abfragehinweise verwendet werden, damit bestimmte Abfragen parallel geschaltet werden können, wird der Wert für den Kostenschwellenwert für Parallelität von SQL weiterhin verwendet, um zu entscheiden, ob tatsächlich parallel geschaltet werden soll oder nicht?

Ich konnte diese spezifischen Informationen nicht ausgraben, obwohl dieser Link darauf hinweist, dass CTFP ignoriert wird, wenn 1 MAXDOPist. Dies ist ohne Abfragehinweise sinnvoll, da keine Anfrage, unabhängig von den Kosten, parallel verläuft, wenn MAXDOP1 ist.

Kann mir jemand mitteilen, wie sich diese beiden Anfragen voraussichtlich verhalten werden?

Beispiel 1:

Instance Maxdop: 1 
CTFP: 50 
Query hint: Maxdop=2 
Query cost: 30

Beispiel 2:

Instance Maxdop: 1
CTFP: 50
Query hint: Maxdop=2
Query cost: 70
Martin Bansey
quelle

Antworten:

20

Wenn eine Instanz MAXDOPauf 1 gesetzt wurde und Abfragehinweise verwendet werden, damit bestimmte Abfragen parallel geschaltet werden können, wird der Wert für den Kostenschwellenwert für Parallelität von SQL weiterhin verwendet, um zu entscheiden, ob tatsächlich parallel geschaltet werden soll oder nicht?

Einfache Antwort: ja .

Einzelheiten

Hier gibt es ein paar getrennte Dinge, die getrennt werden müssen:

  1. Was ist der effektive maximale Grad der Parallelität zur Verfügung zu einer Abfrage?

    Die Mitwirkenden hierfür sind (im Großen und Ganzen in der Reihenfolge ihrer Bedeutung):

    • Resource Governor- MAX_DOPEinstellung
    • Abfrage - Hinweis MAXDOPEinstellung
    • Das max degree of parallelism Instanzkonfigurationsoption

    Die Details werden in der Einstellung "Maximaler Parallelitätsgrad" des Servers, im MAX_DOP von Resource Governor und im Abfragehinweis MAXDOP erläutert. Welchen sollte SQL Server verwenden? von Jack Li, Senior Escalation Engineer für Microsoft SQL Server-Kundendienst und -Support. Die folgende Tabelle ist von diesem Link wiedergegeben:

    Parallelitätstabelle

  2. Verwendet ein Abfrageplan Parallelität?

    Das SQL Server-Abfrageoptimierungsprogramm findet immer zuerst einen seriellen Plan *.

    Dann wenn:

    • Eine weitere Optimierung ist gerechtfertigt; und
    • Die Kosten für den besten Serienplan überschreiten den cost threshold for parallelismKonfigurationswert


    ... wird der Optimierer versuchen , einen parallelen Plan zu finden.

    Dann wenn:

    • Ein paralleler Plan wird gefunden (dh ist möglich); und
    • Die Kosten für den Parallelplan sind geringer als für den besten Serienplan


    ... wird ein paralleler Plan erstellt.

Hinweis: das cost threshold for parallelismbetrifft nur , ob das Optimierungsprogramm sieht für einen parallelen Plan. Sobald ein paralleler Plan zwischengespeichert ist, wird er bei der Wiederverwendung (sofern Threads verfügbar sind) unabhängig von der CTFP-Einstellung mit Parallelität ausgeführt.


Beispiele

Für beide Beispiele mit Instanz maxdop 1 und Abfragehinweis maxdop 2 beträgt der effektive verfügbare DOP 2. Wenn ein paralleler Plan ausgewählt wird, wird DOP 2 verwendet.

Beispiel 1

Bei einem CTFP von 50 und einem günstigen seriellen Plan von 30 wird SQL Server nicht versuchen, einen parallelen Plan zu finden. Ein Serienplan wird erstellt.

Beispiel 2

Bei einem CTFP von 50 und einem günstigen seriellen Plan von 70 wird SQL Server versuchen , einen parallelen Plan zu finden. Wenn dieser Plan (falls gefunden) weniger als 70 (die Kosten des seriellen Plans) kostet, wird ein paralleler Plan erstellt.


Das Endergebnis der Abfrageoptimierung ist immer ein einzelner zwischengespeicherter Plan: seriell oder parallel. Der Optimierer findet nur einen seriellen Plan in den Phasen search0 (TP) und search1 (QP).

Es kann dann (wie beschrieben) search1 erneut ausführen, wobei ein paralleler Plan erstellt werden muss. Anschließend wird auf der Grundlage der bisher besten Gesamtplankosten zwischen seriell und parallel gewählt. Diese Auswahl ist verbindlich, falls die Optimierung zu search2 (Vollständige Optimierung) übergeht . Jede Optimierungsphase berücksichtigt viele Alternativen, aber die Ausgabe einer Stufe ist immer ein einzelner bester Plan, der entweder seriell oder parallel ist.

Ich habe darüber in Mythos geschrieben: SQL Server speichert mit jedem parallelen Plan einen seriellen Plan zwischen

Paul White 9
quelle
2

Beispiel 1 Instanz Maxdop: 1 CTFP: 50 Abfragehinweis: Maxdop = 2 Abfragekosten: 30

Der MAXDOP-Abfragehinweis überschreibt den instanzweiten Maximalgrad der Parallelitätseinstellung. Da CTPF jedoch 50 und Abfragekosten 30 beträgt, kann ein serieller Plan verwendet werden.

Beispiel 2 Instanz Maxdop: 1 CTFP: 50 Abfragehinweis: Maxdop = 2 Abfragekosten: 70

Auch hier wird der maximale Parallelitätsgrad als 2 angenommen, da der MAXDOP-Hinweis vorhanden ist, aber CTFP wird als 50 angenommen und die Abfrage, wenn möglich, wie von Paul erwähnt, kann parallel ausgeführt werden.

Wenn für eine Instanz MAXDOP auf 1 gesetzt ist und Abfragehinweise verwendet werden, damit bestimmte Abfragen parallel geschaltet werden können, wird der Wert für den Kostenschwellenwert für Parallelität von SQL weiterhin verwendet, um zu entscheiden, ob tatsächlich parallel geschaltet werden soll oder nicht?

MAXDOP Hinweis überschreibt die Einstellung des maximalen Parallelitätsgrads.

Zitieren aus dem MAXDOP-Hinweis docs.microsoft

MAXDOP-Nummer Gilt für: SQL Server 2008 bis SQL Server 2017.

Überschreibt die Konfigurationsoption für den maximalen Grad an Parallelität von sp_configure und Resource Governor für die Abfrage, die diese Option angibt. Der MAXDOP-Abfragehinweis kann den mit sp_configure konfigurierten Wert überschreiten. Wenn MAXDOP den mit Resource Governor konfigurierten Wert überschreitet, verwendet das Datenbankmodul den MAXDOP-Wert von Resource Governor.

Shanky
quelle