Ich habe die gleiche Berechnung sowohl in der SELECT- als auch in der GROUP BY-Klausel. Führt SQL Server diese Berechnungen tatsächlich zweimal durch oder ist es intelligent genug, um sie nur einmal durchzuführen?
Die einfache Antwort lautet, dass SQL Server keine allgemeinen Garantien dafür gibt, wann und wie oft ein skalarer Ausdruck zur Ausführungszeit ausgewertet wird.
Innerhalb des Optimierers und der Ausführungs-Engine gibt es alle möglichen komplizierten (und nicht dokumentierten) Verhaltensweisen hinsichtlich der Platzierung, Ausführung und Zwischenspeicherung von skalaren Ausdrücken. Books Online hat dazu nicht viel zu sagen, aber es heißt :
Dies beschreibt eines der Verhaltensweisen, auf die ich zuvor hingewiesen habe, die verzögerte Ausführung von Ausdrücken. Ich habe in diesem Blog-Beitrag über einige der anderen aktuellen Verhaltensweisen (die sich jederzeit ändern können) geschrieben .
Eine weitere Überlegung ist, dass das vom Abfrageoptimierer verwendete Kostenmodell derzeit nicht viel zur Kostenschätzung für skalare Ausdrücke beiträgt. Ohne einen soliden Kostenrahmen basieren die aktuellen Ergebnisse auf einer breiten Heuristik oder einem reinen Zufall.
Bei sehr einfachen Ausdrücken spielt es wahrscheinlich keine große Rolle, ob der Ausdruck in den meisten Fällen einmal oder mehrmals ausgewertet wird. Ich bin jedoch auf große Abfragen gestoßen, bei denen die Leistung beeinträchtigt wurde, wenn der Ausdruck sehr oft redundant ausgewertet wurde, oder wenn die Auswertung in einem einzelnen Thread erfolgt, in dem die Auswertung in einem parallelen Zweig der Ausführung vorteilhaft gewesen wäre planen.
Zusammenfassend ist das aktuelle Verhalten undefiniert und es gibt nicht viel in Ausführungsplänen, um herauszufinden, was passiert ist (und es ist nicht immer bequem, einen Debugger beizufügen, um das detaillierte Verhalten der Engine zu untersuchen, wie im Blog-Beitrag).
Wenn Sie auf Fälle stoßen, in denen Probleme mit der Skalarbewertung für die Leistung von Bedeutung sind, wenden Sie sich an den Microsoft-Support. Dies ist der beste Weg, um Feedback zu geben, um zukünftige Versionen des Produkts zu verbessern.
cross apply
in diesem Fall ist etwas langwierig und würde sehr wahrscheinlich die Leistung beeinträchtigen, wenn eine unnötige Selbstverbindung eingeführt wird.CROSS APPLY
definiert nur den Alias aus Spalten in derselben Zeile. Keine Notwendigkeit für einen Join. zBSELECT COUNT(*), hilo FROM master..spt_values CROSS APPLY (VALUES(high + low)) V(hilo) GROUP BY hilo
Leistung ist nur ein Aspekt. Das andere ist die Wartbarkeit.
Persönlich neige ich dazu, Folgendes zu tun:
AKTUALISIEREN:
Wenn Sie keine Verschachtelung durchführen möchten, können Sie für jede Tabelle, in der Sie komplexe Ausdrücke verwenden müssen, eine ANSICHT erstellen.
Dann können Sie auswählen, ohne zusätzliche Verschachtelung vorzunehmen.
quelle