Gibt es eine Möglichkeit zu verhindern, dass die Memostruktur beschnitten wird?

8

Wir wissen, dass die Memostruktur beschnitten ist und einige teure alternative Pläne während der Optimierung verworfen werden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies zu verhindern, und den Optimierer einfach jeden möglichen Plan berücksichtigen und aus allen Alternativen das Beste auswählen lassen .

zli89
quelle
3
Es ist nicht klar, was Sie verhindern wollen. Möchten Sie den Optimierer irgendwie zwingen, die Kosten für alle möglichen Pläne zu berechnen (die sich auf Billionen von Zillionen belaufen können, selbst bei einer einfachen Abfrage mit 10 Verknüpfungen)?
Ypercubeᵀᴹ
ja, obwohl es nicht möglich scheint. Ich möchte den Optimierer zwingen, alle möglichen Pläne zu berücksichtigen, ihre Kosten zu berechnen und dann den günstigsten auszuwählen.
Zli89
4
Und warum sollte es das tun? Wenn ein Plan mit Kosten = 7 berechnet wurde und dann feststellt, dass jeder Plan, der a hash join b10 enthält , 10 oder mehr kostet, warum sollten Sie dann all diese Millionen Pläne berechnen und sie nicht beschneiden? (nicht, dass der Optimierer so simpel funktioniert)
ypercubeᵀᴹ

Antworten:

12

Wir wissen, dass die Memostruktur beschnitten ist und einige teure alternative Pläne während der Optimierung verworfen werden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies zu verhindern, und den Optimierer einfach jeden möglichen Plan berücksichtigen und aus allen Alternativen das Beste auswählen lassen.

Es gibt, aber ich mache es nicht bekannt, weil es missverstanden und falsch angewendet würde. In jedem Fall würde dies nicht zu einer erschöpfenden Suche im Planraum führen, da nur eine begrenzte Anzahl von Transformationen (solche, die üblicherweise gute Ergebnisse liefern) implementiert werden.

Das Verhindern des Beschneidens und Verwerfens würde im Allgemeinen einfach zu (viel) längeren Kompilierungszeiten führen, ohne die Qualität des endgültigen Plans, falls vorhanden, wesentlich zu verbessern.

Letztendlich ist die Frage natürlich und vernünftig, basiert jedoch auf einem Missverständnis der Ziele des SQL Server-Abfrageoptimierers: Sie soll schnell gute Pläne für allgemeine Abfragen finden. Es basiert nicht auf einem Framework, das für eine umfassende Suche ausgelegt ist.

Wenn Sie eine reale Situation haben, die von einem anderen Optimierungsansatz profitieren würde, könnten Sie dies auf der Connect-Website begründen (obwohl ich es für unwahrscheinlich halte, dass Microsoft die erforderlichen technischen Ressourcen investieren würde).

Paul White 9
quelle
9

Es gibt keinen Knopf oder Trace-Flag, von dem ich weiß, dass er dieses Verhalten in irgendeiner Weise erzwingt (obwohl Paul White hier einige Trace-Flags erwähnt, die mehr Sichtbarkeit bieten und es Ihnen ermöglichen, einige Verhaltens-Deltas zu überreden ).

Microsoft bietet viele Waffen an, aber diese würde fast garantiert 100% der Zeit direkt auf Ihre eigenen Füße zeigen. Wenn Sie eine Abfrage zum ersten Mal ausführen, möchten Sie nicht, dass SQL Server unendlich viel Zeit damit verbringt, jede einzelne mögliche Variation eines Plans zu erstellen, um die gewünschten Ergebnisse zu erzielen. Wie @ypercube erwähnt, könnte dies eine sehr große Anzahl von Plänen sein und den Zweck, die Abfrage überhaupt auszuführen, irgendwie zunichte machen . Ihr Ziel bei der Ausführung einer Abfrage besteht vermutlich darin, irgendwann Daten zurückzugeben, oder? Und "irgendwann" muss innerhalb bestimmter Schwellenwerte liegen, da für bestimmte Ebenen Ihrer Anwendung verschiedene Zeitlimits für Abfragen / Befehle erzwungen werden und Benutzer nur so lange warten, bis eine Seite geladen ist ...

Aaron Bertrand
quelle