Ist die SQL-WHERE-Klausel Kurzschluss ausgewertet?
Beispiel:
SELECT *
FROM Table t
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)
Wenn @ - Taste IST NULL zu true ausgewertet wird, ist @ - Taste IST NICHT NULL UND @key = t.Schlüssel bewerten?
Wenn Nein, warum nicht?
Wenn ja, ist es garantiert? Es ist Teil des ANSI SQL-oder ist es eine bestimmte Datenbank?
Wenn eine bestimmte Datenbank, SqlServer? Oracle? MySQL?
Referenz: Short-Circuit-Evaluation
InformationsquelleAutor der Frage Greg Dean | 2009-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
ANSI-SQL-Entwurf 2003 5WD-01-Rahmen-2003-09.pdf
InformationsquelleAutor der Antwort
Aus der oben durch einen Kurzschluss ist nicht wirklich vorhanden.
Wenn Sie es brauchen, schlage ich vor, eine Case-Anweisung:
Expr1
wird immer ausgewertet, aber nur eine vonExpr2
undExpr3
ausgewertet werden pro Zeile.InformationsquelleAutor der Antwort PMc
Ich denke, dies ist einer der Fälle, wo würde ich schreiben, als ob es nicht Kurzschluss -, aus drei Gründen.
Weil für MSSQL, es ist nicht geklärt durch den Blick auf BOL in die offensichtliche Ort, also für mich, das macht es kirchenrechtlich nicht eindeutig.
weil zumindest weiß ich, dass mein code funktioniert. Und noch wichtiger ist, so werden diejenigen, die nach mir kommen, so bin ich nicht Ihrer Einrichtung sorgen machen, durch die gleiche Frage immer und immer wieder.
Schreibe ich oft genug für mehrere DBMS Produkte, und ich will nicht zu haben, merken die Unterschiede, wenn ich arbeiten kann, um Sie leicht.
InformationsquelleAutor der Antwort dkretz
Ich glaube nicht, dass ein Kurzschluss in SQL Server (2005) ist gewährleistet. SQL Server führt die Abfrage durch seine Optimierungs-Algorithmus, die berücksichtigt, eine Menge Dinge (Indizes, Statistiken, Tabelle, Größe, Ressourcen, etc), um eine effektive Ausführung zu planen. Nach dieser Auswertung, können Sie nicht sicher sagen, dass Ihr Kurzschluss-Logik ist garantiert.
Lief ich in der gleichen Frage, die mich vor einiger Zeit, und meine Forschung wirklich nicht geben mir eine definitive Antwort. Sie können schreiben Sie eine kleine Abfrage, um Ihnen ein Gefühl dafür, dass es funktioniert, aber können Sie sicher sein, dass, wenn sich die Last auf die Datenbank erhöht die Tabellen wachsen, größer zu werden, und Dinge, die optimiert werden und in der Datenbank geändert, dass der Schluss halten. Ich konnte nicht und deshalb irrte auf der Seite der Vorsicht und verwendet FALL in die WHERE-Klausel, um sicherzustellen, Kurzschluss.
InformationsquelleAutor der Antwort Mehmet Aras
Haben Sie im Auge zu behalten, wie Datenbanken funktionieren. Gegeben ist eine parametrisierte Abfrage die db baut einen Ausführungsplan basierend auf der Abfrage ohne die Werte für die Parameter. Diese Abfrage wird jedes mal, wenn die Abfrage ausgeführt wird, unabhängig davon, was die tatsächlichen Werte geliefert werden. Ob die Abfrage Kurzschlüsse mit bestimmten Werten wird es nicht egal, die Ausführung zu planen.
InformationsquelleAutor der Antwort Logicalmind
Ich in der Regel verwenden Sie diese für optionale Parameter. Ist das das gleiche wie ein Kurzschluss?
Dies gibt mir die Möglichkeit zu passen, in -1 oder was auch immer, um Konto für die optionale Prüfung eines Attributs. Manchmal dies schließt die Verknüpfung über mehrere Tabellen, oder vorzugsweise einen Blick.
Sehr praktisch, nicht ganz sicher über die zusätzliche Arbeit, die es gibt auf der db-engine.
InformationsquelleAutor der Antwort p.campbell
Für SQL Server, ich denke, es hängt von der version ab, aber meine Erfahrung mit SQL Server 2000 ist, dass es immer noch wertet @key = t.Schlüssel, auch wenn @key null ist. In anderen Worten, es ist nicht effizient, um Kurzschlüsse bei der Auswertung der WHERE-Klausel.
Habe ich Menschen gesehen, die Empfehlung einer Struktur wie Ihr Beispiel als eine Möglichkeit zu tun, eine flexible Abfrage, wo der Benutzer eingeben kann oder nicht, geben Sie die verschiedenen Kriterien. Meine Beobachtung ist, dass der Schlüssel ist immer noch eingebunden in die Abfrage-plan, wenn @key null ist, und wenn der Schlüssel indiziert ist, dann ist es nicht zu verwenden, den index effizient.
Diese Art der flexiblen Abfrage mit unterschiedlichen Kriterien und ist wohl ein Fall, wo eine dynamisch erstellte SQL ist wirklich der beste Weg zu gehen. Wenn die @ - Taste ist null, dann kann man einfach nicht in die Abfrage auf alle.
InformationsquelleAutor der Antwort tetranz
ich weiß nicht, über kurz circuting, aber ich würde schreiben Sie es als eine if-else-Anweisung
auch, Variablen sollten immer auf der rechten Seite der Gleichung. dies macht es sargable.
http://en.wikipedia.org/wiki/Sargable
InformationsquelleAutor der Antwort DForck42
Stolperte über diese Frage, und er hatte bereits gefunden, dieser blog-Eintrag: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/
Den SQL-server ist frei, um eine Abfrage zu optimieren, überall sieht Sie fit, so dass in dem gegebenen Beispiel in dem blog-post, verlassen Sie sich nicht auf Kurzschluss.
Jedoch ein FALL ist offenbar dokumentiert, um zu bewerten in der SCHRIFTLICHEN Bestellung - überprüfen Sie die Kommentare dieses blog-post.
InformationsquelleAutor der Antwort stolsvik
Haupt-Eigenschaft der short circuit evaluation ist, dass es Stoppt die Auswertung des Ausdrucks, sobald das Ergebnis festgestellt werden kann. Das bedeutet, dass der rest des Ausdrucks kann ignoriert werden, da das Ergebnis gleich, egal es ausgewertet wird oder nicht.
Binären booleschen Operatoren sind comutative, Bedeutung:
also es gibt keine Garantie auf Reihenfolge der Auswertung. Reihenfolge der Auswertung bestimmt werden, die durch den query optimizer.
In Sprachen mit Objekten kann es Situationen geben, wo Sie schreiben, Boolesche Ausdrücke, die ausgewertet werden können, nur mit short-circuit-Evaluierung. Dein Beispielcode Konstruktion wird Häufig verwendet, in diesen Sprachen (C#, Delphi, VB). Zum Beispiel:
In diesem C# - Beispiel führt dazu, dass der Ausnahme, wenn
someString == null
weil es wird vollständig ausgewertet werden. Im Kurzschluss-Auswertung, es funktioniert jedes mal.SQL funktioniert nur auf Skalare Variablen (keine Gegenstände), die nicht initialisiert werden, es gibt also keine Möglichkeit zu schreiben boolescher Ausdruck, der nicht ausgewertet werden kann. Wenn Sie etwas haben NULL Wert, jeder Vergleich false zurück.
Das bedeutet, dass in SQL-Sie kann nicht schreiben, Ausdruck, wird unterschiedlich bewertet je nachdem, mit Kurzschluss-oder full-Bewertung.
Wenn SQL-Implementierung verwendet, short circuit evaluation, es kann nur hoffentlich beschleunigen die Ausführung einer Abfrage.
InformationsquelleAutor der Antwort zendar
Unten ein quick-and-dirty test auf SQL Server 2008 R2:
Dieser gibt unmittelbar keine Aufzeichnungen. Art der Kurzschluss-Verhalten vorhanden war.
Dann so probiert:
kennen kein Datensatz würde die Bedingung erfüllt:
Diese dauerte mehrere Sekunden, der angibt, der Kurzschluss Verhalten war nicht mehr da und die komplexe Bedienung wurde bewertet wird, für jeden Datensatz.
Hoffe, das hilft, Jungs.
InformationsquelleAutor der Antwort Jorge
Hier ist eine demo, um zu beweisen, dass MySQL unterstützt durchführen WHERE-Klausel Kurzschluss:
http://rextester.com/GVE4880
Diese führt dann die folgenden Abfragen:
Der einzige Unterschied zwischen diesen ist die Reihenfolge der Operanden in der ODER-Bedingung.
myslowfunction
bewusst schläft für eine Sekunde und hat den positiven Effekt, dass es einen Eintrag zu einem log-Tabelle jedes mal, wenn es ausgeführt wird. Hier sind die Ergebnisse von dem, was angemeldet ist, die bei der Ausführung der beiden oben genannten Abfragen:Oben zeigt, dass eine langsame Funktion wird ausgeführt, mal mehr, wenn es erscheint auf der linken Seite einer ODER-Bedingung, wenn der andere operand nicht immer der Fall ist (wegen Kurzschluss).
InformationsquelleAutor der Antwort Steve Chambers
Dieser nimmt eine zusätzliche 4 Sekunden in query analyzer, also von dem, was ich sehen kann, WENN nicht sogar kurzgeschlossen...
Wäre es schön, eine garantierte Weg!
InformationsquelleAutor der Antwort
Es ist aber offensichtlich, dass MS Sql server unterstützt die Kurzschluss-Theorie, um die Leistung zu verbessern, durch die unnötige überprüfung,
Unterstützen Beispiel:
Hier das erste Beispiel würde das Ergebnis in Fehler 'Fehler bei der Konvertierung beim konvertieren den varchar-Wert 'A' in den int-Datentyp.'
Während die zweite läuft problemlos, da die Bedingung 1 = 1 WAHR ausgewertet und somit die zweite Bedingung nicht lief bei allen.
Weiter mehr
hier die erste Bedingung würde zu false ausgewertet und damit das DBMS würde für den zweiten Zustand und wieder wird der Fehler der Umwandlung, wie im obigen Beispiel.
HINWEIS: ICH SCHRIEB DEN FEHLERHAFTEN ZUSTAND, NUR ZU ERKENNEN, DAS WETTER DER BEDINGUNG AUSGEFÜHRT WIRD, ODER KURZGESCHLOSSEN
WENN DIE QUERY-ERGEBNISSE IN FEHLER BEDEUTET, DIE BEDINGUNG AUSGEFÜHRT, KURZGESCHLOSSEN SONST.
EINFACHE ERKLÄRUNG
Betrachten,
als die erste Bedingung wird immer ausgewertet, um WAHRseine sinnlos zu bewerten, die zweite Bedingung, weil Ihre Bewertung in was auch immer Wert
würde das Ergebnis nicht beeinflussen, also seine eine gute Gelegenheit für Sql Server zum speichern der Ausführung der Abfrage Zeit durch das überspringen unnötiger Zustand Kontrolle oder Auswertung.
im Falle von "ODER"wenn die erste Bedingung wird ausgewertet, um zu WAHR die gesamte Kette, verbunden durch "ODER" würde als wahr ausgewertet, ohne Bewertung der anderen.
wenn die bedingung1 wahr ausgewertet, rest alle Bedingungen bis conditionN würde übersprungen werden.
In Allgemeinen Worten, bei der Bestimmung der ersten WAHR, alle anderen Bedingungen verbunden ODER würde übersprungen werden.
Betrachten Sie die zweite Bedingung
als die erste Bedingung ist immer evalutated zu FALSE seine sinnlos zu bewerten, die zweite Bedingung, weil Ihre Bewertung in was auch immer Wert
würde das Ergebnis nicht beeinflussen, also wieder eine gute Gelegenheit für Sql Server zum speichern der Ausführung der Abfrage Zeit durch das überspringen unnötiger Zustand Kontrolle oder Auswertung.
im Falle von "UND"wenn die erste Bedingung wird ausgewertet, um zu FALSE die gesamte Kette verbunden mit der "UND" würde als evaluiert zu FALSE, ohne Bewertung der anderen.
wenn die bedingung1 ausgewertet, um FALSErest alle Bedingungen bis conditionN würde übersprungen werden.
In Allgemeinen Worten, bei der Bestimmung der ersten FALSE, alle anderen Bedingungen verknüpft UND würde übersprungen werden.
DAFÜR, EINE KLUGE PROGRAMMIERER SOLLTE IMMER PROGRAMM DIE KETTE DER BEDINGUNGEN IN EINER WEISE, DIE, WENIGER TEUER ODER DIE MEISTEN DIE BESEITIGUNG BEDINGUNG WIRD ZUERST AUSGEWERTET,
ODER VEREINBAREN SIE DEN ZUSTAND IN EINER SOLCHEN WEISE, DASS HÖCHSTENS PROFITIEREN VON KURZSCHLUSS
InformationsquelleAutor der Antwort RkHirpara