Frage

Lassen Sie uns diese beiden Aussagen untersuchen:

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

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

Wenn CONDITION 1 ist TRUE, Wille CONDITION 2 überprüft werden?
Wenn CONDITION 3 ist FALSE, Wille CONDITION 4 überprüft werden?

Was ist mit Bedingungen bei WHERE: optimiert die SQL Server Engine alle Bedingungen in a? WHERE Klausel? Sollten Programmierer Bedingungen in der Rechts Um sicherzustellen, dass der SQL Server -Optimierer es in der Rechts Benehmen?

HINZUGEFÜGT:

Vielen Dank an Jack für Link, Überraschung vom 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

Es gibt keine Erhöhung a Geteilt durch Null Ausnahme in diesem Fall.

FAZIT:

Wenn C ++/C#/VB Kurzschluss hat, warum kann SQL Server es nicht haben?

Um dies wirklich zu beantworten, schauen wir uns an, wie beide mit Bedingungen funktionieren. C ++/C#/VB haben alle in den Sprachspezifikationen definiert, um die Codeausführung zu beschleunigen. Warum sollten Sie sich die Mühe machen, N oder Bedingungen zu bewerten, wenn der erste bereits wahr oder m ist und Bedingungen, wenn der erste bereits falsch ist.

Wir als Entwickler müssen sich 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 alle Bedingungen bewerten und ihm Kosten zuweisen. Diese Kosten werden dann als Ganzes bewertet, um einen Schwellenwert zu bilden, der niedriger sein muss als der definierte Schwellenwert -SQL -Server für einen guten Plan. Wenn die Kosten niedriger sind als der definierte Schwellenwert, der der Plan verwendet wird, wird der gesamte Vorgang erneut mit einer anderen Mischung aus Zustandskosten wiederholt. Die Kosten hier sind entweder ein Scan oder ein Such oder ein Merge-Join oder ein Hash-Join usw. Aus diesem Grund ist das Kurzschluss, wie in C ++/C#/VB verfügbar ist, einfach nicht möglich. Sie mögen denken, dass die Erzwingung des Index in einer Spalte als Kurzstrecke erzwungen wird, dies jedoch nicht der Fall ist. Es erzwingt nur die Verwendung dieses Index und verkürzt die Liste der möglichen Ausführungspläne. Das System basiert weiterhin.

Als Entwickler müssen Sie sich darüber im Klaren sein, dass SQL Server nicht wie in anderen Programmiersprachen durchgeführt wird, und es gibt nichts, was Sie tun können, um es zu zwingen.

War es hilfreich?

Lösung

In SQL Server gibt es keine Garantie, in welcher Reihenfolge die Aussagen in a verarbeitet werden WHERE Klausel. Der einzelne Ausdruck, der eine Anweisung Kurzzeitverkleidung ermöglicht, ist CASE-WHEN. Das Folgende stammt aus einer Antwort, die ich auf Stackoverflow gepostet habe:

Wie SQL Server kurzbauer, wo die Bedingungsbewertung bewertet wird

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

Als Entwickler müssen Sie sich bewusst sein SQL Server findet kein Kurzschluss durchgeführt Als wäre es in anderen Programmiersprachen und getan Es gibt nichts, was Sie tun können, um es zu zwingen.

Weitere Informationen finden Sie im ersten Blog -Eintrag, der zu einem anderen Blog führt:

Kurzschluss SQL Server?

Das letzte Urteil? Nun, ich habe noch keinen, aber es ist wahrscheinlich sicher zu sagen, dass ich das sagen kann Das einzige Mal, dass Sie sicherstellen können, dass ein bestimmter Kurzschluss mehrfach bei Bedingungen in einem Fallausdruck ausdrückt. Mit Standard -booleschen Ausdrücken wird der Optimierer die Dinge bewegt, wenn er anhand der Tabellen, Indizes und Daten, die Sie abfragen, passen.

Andere Tipps

SQL ist a deklarativ Programmiersprache. Im Gegensatz zu C ++, was ein ist Imperativ Programmiersprache.

Dh du kannst es sagen was Sie wollen im Endre-Result, aber Sie können nicht diktieren wie Das Ergebnis wird ausgeführt, es liegt alles um die Engine.

Die einzig wahre Möglichkeit, "Kurzschluss" (oder einen anderen anderen zu gewährleisten Steuerfluss) Innerhalb WHERE ist die Verwendung indexierten Ansichten, temporären Tabellen und ähnlichen Mechanismen.

Ps. Sie können auch Hinweise zum Ausführungsplan verwenden (um die Engine zu "hinweisen", wie man eine Abfrage ausführt, welche Indizes und deren Verwendung), dachte ich, ich sollte sie erwähnen, während wir uns mit diesem Thema befinden ...

1)-oder (eine oder beide Bedingungen werden wahr sein)

Wenn Bedingung 1 wahr ist, kann der Zustand 2 auch überprüft werden, dass er entweder wahr oder falsch sein kann

--Und (beide Bedingungen müssen wahr sein)

Wenn Bedingung 1 falsch ist, wird die Bedingung 2 nicht überprüft

Die einzige Möglichkeit, zu steuern, wie Bedingungen in der Where -Klausel darin bestehen, Klammern zu verwenden, um sie zusammen zu gruppieren.

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

unterscheidet sich sehr von

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top