Ist es möglich, dem Optimierer mehr oder mehr Zeit zu geben, als er benötigt?

18

Da das Optimierungsprogramm nicht die erforderliche Zeit in Anspruch nehmen kann (es muss die Ausführungszeit minimieren und nicht dazu beitragen), um alle möglichen Ausführungspläne zu untersuchen, wird es manchmal abgeschnitten.

Ich habe mich gefragt, ob dies überschrieben werden kann, damit Sie dem Optimierer jederzeit die erforderliche Zeit (oder eine bestimmte Anzahl von Millisekunden) geben können.

Ich habe keine Notwendigkeit für diese (atm), aber ich kann mir ein Szenario vorstellen, in dem eine komplexe Abfrage in einer engen Schleife ausgeführt wird und Sie den optimalen Plan ausarbeiten und ihn vor der Hand zwischenspeichern möchten.

Natürlich hast du eine enge Schleife, du solltest die Abfrage umschreiben, damit sie verschwindet, aber ertrage sie mit mir.

Dies ist eher eine Frage aus Neugier und um zu sehen, ob es manchmal einen Unterschied zwischen einer kurzgeschlossenen und einer vollständigen Optimierung gibt.

Es stellt sich heraus, dass Sie dem Optimierer mit dem Ablaufverfolgungsflag 2301 mehr Zeit geben können. Es ist nicht genau das, was ich gefragt habe, aber es kommt dem nahe.

Die besten Informationen hierzu finden Sie in den Modellierungserweiterungen für Abfrageprozessoren in SQL Server 2005 SP1 von Ian Jose.

Verwenden Sie diese Ablaufverfolgungsflagge mit Vorsicht! Aber es kann nützlich sein, wenn Sie bessere Pläne haben. Siehe auch:

Ich dachte an Abfragen mit vielen Verknüpfungen, bei denen der Lösungsraum für die Verknüpfungsreihenfolge exponentiell explodiert. Die Heuristiken, die SQL Server verwendet, sind ziemlich gut, aber ich habe mich gefragt, ob das Optimierungsprogramm eine andere Reihenfolge vorschlagen würde, wenn es mehr Zeit hätte (im Bereich von Sekunden oder sogar Minuten).

Buckley
quelle

Antworten:

16

Neben Ablaufverfolgungsflag 2301 gibt es 8780 , die wirklich das Optimierungsprogramm macht die Arbeit schwieriger " , da sie gibt es nur mehr Zeit (nicht unbegrenzt, wie im Detail beschrieben hier (russisch) und weniger detailliert hier ) seine Sache zu tun.

Ausführliche Beschreibung des Originalautors des russischen Artikels in englischer Sprache. Das beinhaltet die Warnung des Autors:

Es wird nicht empfohlen, es jemals in der Produktion zu verwenden .

Kombinieren Sie die beiden und wenden Sie sie (sehr selektiv über den Abfragehinweis OPTION (QUERYTRACEON 2301, QUERYTRACEON 8780) auf eine Abfrage von 4-stufigen verschachtelten Inline-TVFs an (wobei nur die untere Ebene echte Arbeit leistet und die oberen Ebenen Ergebnisse korrelieren via EXISTS-Unterabfragen) führten zu einem netten MERGE JOIN und mehreren LAZY SPOOLs, die die Ausführungszeit halbierten.

ENOTTY
quelle
4

Nein, kannst du nicht.

Sie können Ihre Abfragen "optimiererfreundlich" gestalten, indem Sie verstehen, wie es funktioniert (komplexes Biest, es ist nicht erforderlich, es von innen nach außen zu kennen). Ich würde vorschlagen, dass Sie, wenn Sie etwas so zeitkritisches tun, die Abfrage korrigieren, anstatt die Funktionsweise von SQL Server zu ändern.

Sie möchten beispielsweise wissen, wann eine Abfrage weniger effizient skaliert als O (n), wenn sich das Datenvolumen und die Datenverteilung ändern. Wenn Sie dem Optimierer mehr Zeit geben, wird hier kein Wert hinzugefügt.

gbn
quelle