Es hängt vom Abfrageplan ab, der durch die geschätzten Kosten jedes betrachteten alternativen Plans bestimmt wird, die zu korrekten Ergebnissen führen würden.
Wenn das Prädikat 'cheapLookup = 1' einen Index verwenden kann und es ausreichend selektiv ist, würde SQL Server wahrscheinlich versuchen, auf diesem Index zu suchen und das zweite Prädikat als Residuum anzuwenden (das heißt, es nur für Zeilen auszuwerten, die werden von der Suchoperation abgeglichen).
Andererseits, wenn cheapLookup nicht der führende Schlüssel in einem Index ist oder wenn es nicht sehr selektiv ist, kann SQL Server prüfen, ob beide Prädikate auf jede gefundene Zeile angewendet werden.
Das zweite Prädikat wird nicht für eine Suchoperation ausgewählt, es sei denn, es gibt eine indizierte berechnete Spalte für den gesamten Ausdruck, und die Verwendung dieses Index erweist sich als der billigste Weg, die gesamte Abfrage auszuführen. Wenn ein geeigneter Index vorhanden ist, sucht SQL Server nach einem zweiten Prädikatsergebnis & lt; 0,9 ', und wenden Sie' cheapLookup = 1 'als Rest an. Es besteht auch die Möglichkeit, dass die indizierte berechnete Spalte cheapLookup als ihren zweiten Schlüssel hat, was zu einer reinen Suche ohne Rest führen würde.
Die zweite Sache des zweiten Prädikats ist, dass SQL Server ohne eine berechnete Spalte (ob indiziert oder nicht) die Selektivität des Ausdrucks erraten muss. Mit der berechneten Spalte kann der Server möglicherweise Statistiken für die Spalte expression-results erstellen, die dem Optimierer helfen. Beachten Sie, dass eine berechnete Spalte in 'CAST (someField as FLOAT) / otherField' beibehalten werden müsste, bevor sie indiziert werden könnte oder Statistiken erstellt werden könnten, da sie einen ungenauen Datentyp enthält.
Zusammenfassend ist es nicht die Komplexität des Ausdrucks, die so viel zählt wie die geschätzten Kosten des gesamten Plans, der jede der vom Optimierer berücksichtigten verfügbaren Zugriffsmethoden verwendet.
SQL ist deklarativ: Sie sagen der Datenbank, was Sie wollen, nicht wie Sie es wollen. Die Datenbank ist völlig frei, um faul oder eifrig zu bewerten. Tatsächlich kann es dreimal in umgekehrter Reihenfolge für alles, was ich weiß, auswerten:)
In seltenen Fällen können Sie die Leistung verbessern, indem Sie Ihre Abfrage so umrahmen, dass ein bestimmter teurer Vorgang vermieden wird. Zum Beispiel würde das Verschieben der Fließkomma-Mathematik in eine separate Abfrage eine faule Auswertung erzwingen:
%Vor%In Ihrem Beispiel würde ich erwarten, dass SQL Server den besten Weg ohne irgendwelche Hinweise oder Tricks wählt.
Was Sie meinen, ist ein Kurzschluss, wie bei anderen Sprachen (z. B. C #).
Ich glaube, SQL Server kann kurzschließen, hängt aber vom Szenario ab / was im Optimierer passiert, also gibt es sicherlich keine Garantie dafür. Es kann nur könnte .
Hervorragende Referenz hierüber von Remus Rusanu hier:
Ссылка
Tags und Links sql-server sql-server-2008 lazy-evaluation