Logische Operatoren ODER UND in Bedingung und Reihenfolge der Bedingungen in WO


33

Untersuchen wir diese beiden Aussagen:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Wenn CONDITION 1ja TRUE, wird CONDITION 2geprüft?
Wenn CONDITION 3ja FALSE, wird CONDITION 4geprüft?

Was ist mit Bedingungen für WHERE: Optimiert das SQL Server-Modul alle Bedingungen in einer WHEREKlausel? 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.


Woher kommt der letzte Anführungszeichenblock? Könnten Sie eine Referenz hinzufügen?
Nick Chammas

Antworten:


25

In SQL Server gibt es keine Garantie, ob oder in welcher Reihenfolge die Anweisungen in einer WHEREKlausel verarbeitet werden. Der einzige Ausdruck, der das Kurzschließen von Anweisungen ermöglicht, ist CASE- WHEN. Folgendes stammt aus einer Antwort, die ich auf Stackoverflow gepostet habe:

Wie SQL Server die WHERE-Bedingungsbewertung kurzschließt

Es tut es, wenn es sich so anfühlt, aber nicht so, wie Sie es sich sofort vorstellen.

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 .

Weitere Informationen finden Sie unter dem ersten Link im obigen Blogeintrag, der zu einem anderen Blog führt:

Führt SQL Server-Kurzschluss durch?

Das endgültige Urteil? Nun, ich habe noch keine, aber es ist wahrscheinlich sicher zu sagen, dass Sie einen bestimmten Kurzschluss nur dann sicherstellen können, wenn Sie mehrere WHEN-Bedingungen in einem CASE-Ausdruck ausdrücken. Mit Standard-Booleschen Ausdrücken verschiebt das Optimierungsprogramm die Elemente basierend auf den Tabellen, Indizes und Daten, die Sie abfragen, nach Belieben.


2
Anscheinend gibt es einige Randfälle (oder einen Bug), in denen sogar case nicht sicher ist
Jack Douglas

1
Ich zeige auch einen anderen Fall (ha!), In dem CASEPausen auftreten: dba.stackexchange.com/questions/12941/…
Aaron Bertrand


0

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, WHEREbesteht 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).


-4

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


"Wenn Bedingung 1 FALSCH ist, wird Bedingung 2 nicht überprüft." Dies ist nicht wahr. Siehe die Antwort oben . SQL Server kann weiterhin Bedingung 2 auswerten, da in WHEREKlauseln keine Kurzschlussauswertung durchgeführt wird .
Nick Chammas

-4

Die einzige Möglichkeit zu steuern, wie Bedingungen in der WHERE-Klausel definiert werden, besteht darin, sie mithilfe von Klammern zu gruppieren.

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

ist sehr verschieden von

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')

Nur neugierig. Wie unterscheiden sich diese beiden Zustände? Unterschiedliche Ergebnisse, Leistung, Ausführungsplan? Ich dachte, sie wären gleichwertig.
ypercubeᵀᴹ

Mit dem ersten müssen Sie Col1, Col4 und entweder Col2 oder Col3 übereinstimmen. In der zweiten Zeile müssen Col1 und Col2 übereinstimmen, oder Sie müssen Col3 und Col4 übereinstimmen, aber Col1 und Col4 müssen niemals beide zusammen ausgewertet werden.
Mrdenny

1
Nein, du liegst falsch. ANDhat höhere Priorität als OR. Beide sind gleichwertig. Was Sie sagen, würde für die WHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = xAbfrage zutreffen . Siehe SQL-Fiddle-Test
ypercubeᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.