Wählen Sie die Bewertungsreihenfolge "where clause" aus
In Sql Server 2005, wenn ich mehrere Parameter habe ich die Garantie, dass die Bewertung um wird immer werden von Links nach rechts?
Sich mit einem Beispiel:
select a from table where c=1 and d=2
In dieser Abfrage, wenn das "c=1" - Bedingung schlägt fehl, das "d=2" - Bedingung wird nie ausgewertet?
PS- "c" ist eine ganze Zahl indizierte Spalte d ist eine große varchar und nicht Wendeplatten-Spalte, die erfordert, dass ein full table scan
update ich habe versucht zu vermeiden, bei zwei Abfragen oder bedingte Anweisungen, brauche ich nur sowas wie: wenn "c-condition" schlägt fehl, es gibt einen Weg, um zu vermeiden, die Durchführung der schwere "d-Zustand", denn es ist nicht nötig in meinem Fall.
InformationsquelleAutor der Frage t3mujin | 2009-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Garantien für die Auswertung um. Der Optimierer wird versuchen zu finden, die effizienteste Methode zum ausführen der Abfrage mit den verfügbaren Informationen.
In Ihrem Fall, da c ist indiziert und d ist nicht der Optimierer sollte in der index zu finden, alle Zeilen, die mit dem Prädikat auf c, dann rufen Sie die Zeilen aus der Tabelle Daten zu bewerten, die das Prädikat auf d....
Jedoch, wenn er feststellt, dass der index auf c ist nicht sehr selektiv (wenn auch nicht in deinem Beispiel, eine Spalte Geschlecht ist nur selten sinnvoll indiziert), kann es sich entscheiden, tun Sie das Scannen der Tabelle sowieso.
Bestimmen die Reihenfolge der Ausführung, Sie sollen sich erklären, den plan für Ihre Abfrage. Beachten Sie jedoch, dass dieser plan kann sich ändern, je nachdem, was der Optimierer denkt, ist die beste Abfrage jetzt.
InformationsquelleAutor der Antwort kdgregory
Generiert SQL Server einen optimierten plan für jede Anweisung, die ausgeführt wird. Sie müssen nicht um Ihre where-Klausel zu erhalten, profitieren. Den nur garuntee Sie haben, ist, dass es Aussagen in Ordnung so:
wird, führen Sie die erste Zeile vor der zweiten.
InformationsquelleAutor der Antwort Orion Adrian
Kann man sich den Ausführungsplan der Abfrage und ermitteln, was Sie tatsächlich versuchen zu tun. Ich denke, dass die Abfrage-engine-SQL Server-ist eigentlich diese Art von scan und intelligent, übersetzen Sie es in Betrieb. Wie, wenn Sie "teuer-op UND falsch", wird es schnell zu false ausgewertet.
Von dem, was ich gelernt habe, was Ihr Typ ist (und sein kann) anders aus, was tatsächlich ausgeführt wird. Sie sind lediglich der dem server mitteilt, welche Art von Ergebnissen Sie erwarten. Wie bekommt es die Antwort nicht korrelieren Links-rechts-code, den Sie bieten.
InformationsquelleAutor der Antwort Mark Canlas
Wenn Sie sicher sein möchten, können Sie die Abfrageausführungsplan. Der Ausführungsplan, MSSQL erstellt/optimiert ist intelligent genug, um zu überprüfen, die indizierte Spalte, bevor eine varchar-Spalte.
InformationsquelleAutor der Antwort cgreeno
Den MS SQL Server-Abfrageoptimierer Kurzschluss, ja. Garantiert.
Dies ausführen:
Läuft es Prima und keine Fehler, obwohl Sie die Division durch null, da der Abfrageoptimierer Kurzschluss-auswerten der where-Klausel. Dies hat Auswirkungen für jede where-Klausel, wo Sie sind "und"-ing und eine der und Teile ist eine Konstante.
InformationsquelleAutor der Antwort Robert C. Barth
Kurzschluss erfolgt, wenn die Bedingung, die wir verweisen, enthält nur Literale oder Konstanten. So zum Beispiel, können sagen, wir haben eine Tabelle TableA die Spalte num alle positiven zahlen von 1 bis 10 und dann Schreibe ich diese Abfrage.
Select num from TableA WHERE TableA.num < 0 UND 1/0 = 10.
Resultiert in einer Fehlermeldung.
Compiler ist intelligent genug, um festzustellen, dass meine zweite Klausel besteht aus Konstanten, so sollte es bewerten, dass vor der Auswertung Klausel, die erfordert keine scan aus der Tabelle oder index?
InformationsquelleAutor der Antwort Nitin Midha
Einer Weise zu Steuern, die Bewertung um ist mit der CASE-Ausdruck.
[Bearbeiten]
Die gängige Meinung, die ich Ausdrücken wollte, war:
Es tut sich ein bisschen komplizierter, als dass, wie in der Website unter:
http://blogs.msdn.com/b/bartd/archive/2011/03/03/don-t-depend-on-expression-short-circuiting-in-t-sql-not-even-with-case.aspx
InformationsquelleAutor der Antwort Ric Tokyo