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?
sql-server
execution-plan
determinism
James L
quelle
quelle
Antworten:
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).quelle