Untersuchen wir diese beiden Aussagen:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Wenn CONDITION 1
ja TRUE
, wird CONDITION 2
geprüft?
Wenn CONDITION 3
ja FALSE
, wird CONDITION 4
geprüft?
Was ist mit Bedingungen für WHERE
: Optimiert das SQL Server-Modul alle Bedingungen in einer WHERE
Klausel? Sollen Programmierer die Bedingungen in die richtige Reihenfolge bringen, um sicherzustellen, dass der SQL Server-Optimierer sie auf die richtige Weise auflöst ?
HINZUGEFÜGT:
Vielen Dank an Jack für den Link, Überraschung von T-SQL-Code:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
In diesem Fall wird keine Division durch Null- Ausnahme ausgelöst.
FAZIT:
Wenn C ++ / C # / VB einen Kurzschluss aufweist, warum kann SQL Server diesen nicht haben?
Um dies wirklich zu beantworten, werfen wir einen Blick darauf, wie beide Bedingungen funktionieren. In C ++ / C # / VB sind alle Kurzschlüsse in den Sprachspezifikationen definiert, um die Codeausführung zu beschleunigen. Warum sich die Mühe machen, N ODER-Bedingungen auszuwerten, wenn die erste bereits wahr ist, oder M UND-Bedingungen, wenn die erste bereits falsch ist?
Wir als Entwickler müssen uns bewusst sein, dass SQL Server anders funktioniert. Es ist ein kostenbasiertes System. Um den optimalen Ausführungsplan für unsere Abfrage zu erhalten, muss der Abfrageprozessor jede Where-Bedingung auswerten und ihnen Kosten zuweisen. Diese Kosten werden dann als Ganzes ausgewertet, um einen Schwellenwert zu bilden, der niedriger sein muss als der von SQL Server für einen guten Plan festgelegte Schwellenwert. Wenn die Kosten unter dem festgelegten Schwellenwert liegen, wird der Plan verwendet. Wenn nicht, wird der gesamte Prozess mit einem anderen Mix von Konditionskosten wiederholt. Hier kostet entweder ein Scan oder ein Such- oder Merge-Join oder ein Hash-Join usw ... Aus diesem Grund ist das in C ++ / C # / VB verfügbare Kurzschließen einfach nicht möglich. Sie könnten denken, dass das Erzwingen der Verwendung eines Index für eine Spalte als Kurzschluss gilt, aber dies ist nicht der Fall. Sie erzwingt nur die Verwendung dieses Index und verkürzt damit die Liste der möglichen Ausführungspläne. Das System ist weiterhin kostenbasiert.
Als Entwickler müssen Sie sich darüber im Klaren sein, dass SQL Server keine Kurzschlüsse ausführt, wie dies in anderen Programmiersprachen der Fall ist, und dass Sie nichts tun können, um dies zu erzwingen.
Antworten:
In SQL Server gibt es keine Garantie, ob oder in welcher Reihenfolge die Anweisungen in einer
WHERE
Klausel verarbeitet werden. Der einzige Ausdruck, der das Kurzschließen von Anweisungen ermöglicht, istCASE
-WHEN
. Folgendes stammt aus einer Antwort, die ich auf Stackoverflow gepostet habe:Wie SQL Server die WHERE-Bedingungsbewertung kurzschließt
Weitere Informationen finden Sie unter dem ersten Link im obigen Blogeintrag, der zu einem anderen Blog führt:
Führt SQL Server-Kurzschluss durch?
quelle
case
nicht sicher istCASE
Pausen auftreten: dba.stackexchange.com/questions/12941/…In T-SQL kann die
IF
Anweisung einen Kurzschluss verursachen, Sie können sich jedoch nicht darauf verlassen, dass die Ausdrücke in der richtigen Reihenfolge ausgewertet werdenquelle
SQL ist eine deklarative Programmiersprache. Anders als zum Beispiel C ++, eine zwingende Programmiersprache.
Dh Sie können sagen, was Sie im Endergebnis wollen, aber Sie können nicht vorschreiben, wie das Ergebnis ausgeführt wird, es hängt alles von der Engine ab.
Der einzig wahre Weg, um ein "Kurzschließen" (oder einen anderen Steuerungsfluss ) im Inneren zu gewährleisten,
WHERE
besteht darin, indizierte Ansichten, temporäre Tabellen und ähnliche Mechanismen zu verwenden.PS. Sie können auch Ausführungsplanhinweise verwenden (um der Engine mitzuteilen, wie eine Abfrage ausgeführt werden soll, welche Indizes verwendet werden sollen und wie sie verwendet werden sollen).
quelle
1) - ODER (eine oder beide Bedingungen sind WAHR)
Wenn Bedingung 1 WAHR ist, wird auch Bedingung 2 überprüft, ob sie WAHR oder FALSCH sein kann
--AND (beide Bedingungen müssen WAHR sein)
Wenn Bedingung 1 FALSE ist, wird Bedingung 2 nicht geprüft
quelle
WHERE
Klauseln keine Kurzschlussauswertung durchgeführt wird .Die einzige Möglichkeit zu steuern, wie Bedingungen in der WHERE-Klausel definiert werden, besteht darin, sie mithilfe von Klammern zu gruppieren.
ist sehr verschieden von
quelle
AND
hat höhere Priorität alsOR
. Beide sind gleichwertig. Was Sie sagen, würde für dieWHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = x
Abfrage zutreffen . Siehe SQL-Fiddle-Test