Wie deterministisch ist die Erstellung eines Ausführungsplans in SQL Server?


13

Gegeben die folgenden Konstanten:

  • Dieselbe Datenbank mit derselben Struktur (Tabellen, Indizes usw.)
  • Die gleichen Daten
  • Dieselbe SQL Server- und Hardwarekonfiguration
  • Die gleichen Statistiken
  • Die gleichen SET-Optionen im Client
  • Dieselben SQL Server-Versionen
  • Die gleichen Ablaufverfolgungsflags

Wird SQL Server angesichts dieser Konstanten für eine bestimmte Abfrage immer denselben Plan erstellen?

Wenn nicht, gibt es noch andere Überlegungen? Gibt es auch ein Element des Nichtdeterminismus zu berücksichtigen?


Es wird falsch sein, denselben Plan zu sagen, aber wir können einen ähnlichen Plan sagen. Zusammen mit den externen Faktoren, die DBA / Developer steuern kann; "Algorithmen zur Optimierung von Abfrageplänen" und "Algorithmen für interne Abfragekosten" sind in die SQL Server-Engine geschrieben. Wir haben nicht die Kontrolle, in jeder Hinsicht zu sagen, was wir wählen sollen. wir können externes env einstellen, um Maschine zu führen, um am besten zu wählen. Wenn der Optimierer für eine bestimmte Abfrage zwei Ausführungspläne mit einem Kostenunterschied von beispielsweise 0,001 erstellt hat, ist es vermutlich irrelevant, welchen Ausführungsplan er auswählt.
Anup Shah

Ich denke nicht, dass Sie diesbezüglich zu theoretisch sein sollten. Ich habe 25 Jahre mit verschiedenen Datenbanken gearbeitet und es ist fast immer möglich, eine Abfrage neu zu schreiben, um sie besser auszuführen. Und manchmal ist es sehr schwer zu verstehen, warum es mit einer Schreibweise der Abfrage besser ist.

Antworten:


13

Wird SQL Server angesichts dieser Konstanten für eine bestimmte Abfrage immer denselben Plan erstellen? Wenn nicht, gibt es noch andere Überlegungen? Gibt es auch ein Element des Nichtdeterminismus zu berücksichtigen?

Die Kompilierung von Abfragen ist meines Wissens deterministisch. Eines der ursprünglichen QO-Entwurfsziele war, dass es möglich sein sollte, Ausführungspläne auf einem anderen System unter Verwendung einer statistischen Kopie der Datenbank zu reproduzieren . Es gibt einige Feinheiten, die sich mit Konfigurationsparametern wie der verfügbaren Speicherkapazität und der Anzahl der logischen Prozessoren befassen. Diese sind jedoch in Ihrer Liste der zu synchronisierenden Aufgaben enthalten.

Vorsichtsmaßnahme: Das ist richtig, vorausgesetzt, das Wort "gleich" in Ihrer Liste bedeutet in jeder Hinsicht genau dasselbe . Beispielsweise können auf beiden Systemen die gleichen Statistiken vorhanden sein, die jedoch nur dann exakt gleich sind, wenn die Histogrammschritte und die Dichteinformationen identisch sind .

Der Optimierungsprozess ist jedoch auch äußerst komplex , was bedeutet, dass es schwierig sein kann, sicherzustellen, dass alle Eingaben in diesen deterministischen Prozess identisch sind und dass alle internen Zustände ähnlich genug sind, um sicherzustellen, dass für einen bestimmten Code der gleiche Pfad durch den Optimierer genommen wird Zusammenstellung. Wenn die Abfrage Zugriff außerhalb der Datenbank (auf eine andere Datenbank oder Instanz) enthält, müssen auch diese Umgebungen identisch sein.

Eine Sache, die ich Ihrer Liste hinzufügen möchte, ist zu überprüfen, ob Planungshilfen auch in der zweiten Datenbank vorhanden sind.


Die Verwendung nicht deterministischer Funktionen wie GETDATE()in Abfragen kann dazu führen, dass Sie auch einen anderen Plan erhalten. Während der Hauptoptimierer den Wert nicht direkt verwendet, kann die Kardinalitätsschätzung (siehe Konstante Faltung und Ausdrucksbewertung während der Kardinalitätsschätzung ). Ich bin mir nicht sicher, ob diese Klasse von Unterschieden in den Bereich der Frage fällt, da beide Systeme den gleichen Plan erzeugen würden, wenn sie zur gleichen Zeit ausgeführt würden (oder allgemeiner mit den gleichen Eingabevariablen, Parametern und Funktionswerten).

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.