MAXDOP funktioniert nicht?


7

Ich wollte MAXDOPauf meinem Computer testen . Also habe ich MAXDOPfür eine bestimmte Abfrage 2 gesetzt. Als ich mir jedoch beim Ausführen der Abfrage meine logischen Prozessoren im Task-Manager ansah, sah es so aus, als würden sie alle verwendet. Ich dachte, dass es nur 2 logische Prozessoren verwenden würde, wenn MAXDOPauf 2 gesetzt würde? Weiß jemand was passiert? Bitte siehe Bild unten.

Ein weiteres Problem ist, dass der DOPvom Ausführungsplan zurückgegebene Wert 1 lautet . Jetzt weiß ich, dass die Einstellung MAXDOPnicht bedeutet, dass SQL Server tatsächlich die festgelegte Nummer verwendet. Angesichts der Tatsache, dass anscheinend alle meine 4 logischen Prozessoren zur Verarbeitung der Abfrage verwendet wurden, war es noch seltsamer, DOP1 zu sehen .

Dies ist die Abfrage, die ich ausgeführt habe: Geben Sie hier die Bildbeschreibung ein

Dies ist passiert, als ich es ausgeführt habe (dh es sieht so aus, als würden alle 4 logischen Prozessoren zum Ausführen der Abfrage verwendet): Geben Sie hier die Bildbeschreibung ein

Antworten:


19

Die Abfrage ist ein nicht-parallel (seriell) Plan , so dass es auf jeden Fall von Anfang bis Ende ausgeführt wird auf einem einzigen SQL Server - Worker - Thread mit einem einzigen SQLOS verbunden ist , Scheduler .

Aus Betriebssystemsicht unterliegt dieser einzelne Thread standardmäßig weiterhin den normalen Planungsalgorithmen von Windows. Ich sage "standardmäßig", da das Verhalten von der Einstellung der CPU-Affinitätsmaske abhängt .

Standardmäßig besteht die Maske nur aus Nullen. Dies bedeutet, dass Windows auswählen kann, auf welcher physischen Ausführungseinheit (z. B. Kern) der Thread pro Zeitscheibe ausgeführt werden soll. Wenn die CPU-Affinitätsmaske für den betreffenden Scheduler auf 1 gesetzt ist, ist der Scheduler jederzeit an eine bestimmte physische Verarbeitungseinheit gebunden.

Ein SQL Server-Thread, der zu 100% ausgeführt wird, springt also tendenziell um physische Einheiten herum, was zu einem "verschmierten" Muster führt. Wenn die Affinitätsmaske festgelegt ist, wird eine sauberere Spitze in der Aktivität angezeigt, da Windows den Thread nicht verschieben darf.

Alles in allem ist das Muster, das Sie im Task-Manager sehen, keine gute Möglichkeit, die CPU-Aktivität von SQL Server zu untersuchen. SQL Server ist nicht der einzige Prozess, der ausgeführt wird, wenn Ihre Abfrage ausgeführt wird. Sie sehen auch, dass die CPU-Auslastung von SSMS Ergebnisse empfängt und diese beispielsweise auf den Bildschirm schreibt.

SQL Server bietet eine Reihe dynamischer Verwaltungsobjekte, mit denen Sie beispielsweise Scheduler, Worker und Threads anzeigen können. Es gibt noch mehr Möglichkeiten, um den Status aktueller Sitzungen, Anfragen usw. anzuzeigen.

Falls diese Konzepte für Sie neu sind, lesen Sie den TechNet-Artikel, SQL Server Batch oder Task Scheduling und verwandte Inhalte.

Ein weiteres Problem ist, dass der vom Ausführungsplan zurückgegebene DOP 1 lautet

Der MAXDOPAbfragehinweis begrenzt nur die Gesamtzahl der Scheduler, die eine Abfrage verwenden kann. Zur Kompilierungszeit kann der Optimierer basierend auf Kostenschätzungen zwischen einem seriellen und einem parallelen Plan entscheiden. Für eine sehr einfache SELECTAbfrage wie die in der Frage wählt der Optimierer normalerweise einen "trivialen" Ausführungsplan, der niemals Parallelität verwendet.


1
Paul, vielen Dank für diese Antwort! Es beantwortet auch meine alte Frage: dba.stackexchange.com/questions/55245/…
Edward Dortland

1
@EdwardDortland Ich hatte diese Frage schon einmal gesehen - nach meiner positiven Bewertung zu urteilen - aber sie vergessen. Zu der Zeit antwortete ich nicht, weil die bestehende es zu decken schien. Wenn ich mit dieser Antwort geholfen habe, die Dinge zu klären, ist das ein Bonus! Danke, dass du mich alarmiert hast :)
Paul White 9
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.