it-swarm.com.de

Logische Operatoren OR AND in Bedingung und Reihenfolge der Bedingungen in WHERE

Lassen Sie uns diese beiden Aussagen untersuchen:

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

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

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

Was ist mit den Bedingungen für WHERE: Optimiert die SQL Server-Engine alle Bedingungen in einer WHERE -Klausel? Sollten Programmierer Bedingungen in der Reihenfolge rechts platzieren, um sicherzustellen, dass das SQL Server-Optimierungsprogramm sie auf die Weise rechts auflöst?

HINZUGEFÜGT :

Vielen Dank an Jack für den 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

In diesem Fall gibt es keine Ausnahme von Teilen durch Null.

SCHLUSSFOLGERUNG :

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

Um dies wirklich zu beantworten, schauen wir uns an, wie beide mit Bedingungen arbeiten. In C++/C #/VB ist in den Sprachspezifikationen ein Kurzschluss definiert, um die Codeausführung zu beschleunigen. Warum sollte man sich die Mühe machen, N OR Bedingungen zu bewerten, 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 wo-Bedingung bewerten und ihm Kosten zuweisen. Diese Kosten werden dann als Ganzes ausgewertet, um einen Schwellenwert zu bilden, der niedriger sein muss als der definierte Schwellenwert, den SQL Server für einen guten Plan hat. Wenn die Kosten unter dem definierten Schwellenwert liegen, wird der Plan verwendet, wenn nicht, wird der gesamte Prozess mit einer anderen Mischung von Bedingungskosten erneut wiederholt. Die Kosten hier sind entweder ein Scan oder ein Such- oder ein Zusammenführungs-Join oder ein Hash-Join usw. Aus diesem Grund ist der Kurzschluss, wie er in C++/C #/VB verfügbar ist, einfach nicht möglich. Sie könnten denken, dass das Erzwingen der Verwendung des Index für eine Spalte als Kurzschluss gilt, dies jedoch nicht. Es erzwingt nur die Verwendung dieses Index und verkürzt damit die Liste möglicher Ausführungspläne. Das System ist immer noch kostenbasiert.

Als Entwickler müssen Sie sich bewusst sein, dass SQL Server keine Kurzschlüsse wie in anderen Programmiersprachen ausführt und Sie nichts tun können, um dies zu erzwingen.

35
garik

In SQL Server gibt es keine Garantie dafür, ob oder in welcher Reihenfolge die Anweisungen in einer WHERE -Klausel verarbeitet werden. Der einzelne 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 WHERE-Zustandsbewertung kurzschließt

Es funktioniert, 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 in anderen Programmiersprachen und Sie können nichts tun, um dies zu erzwingen.

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

Kurzschluss von SQL Server?

Das endgültige Urteil? Nun, ich habe noch keine, aber es ist wahrscheinlich sicher zu sagen, dass das einzige Mal, dass Sie einen bestimmten Kurzschluss sicherstellen können, ist, wenn Sie mehrere WHEN-Bedingungen in einem CASE-Ausdruck ausdrücken. = Bei Standard-Booleschen Ausdrücken verschiebt der Optimierer die Dinge nach eigenem Ermessen basierend auf den Tabellen, Indizes und Daten, die Sie abfragen.

27
MicSim

In T-SQL kann die Anweisung IF einen Kurzschluss verursachen, aber Sie können sich nicht darauf verlassen, dass die Ausdrücke der Reihe nach ausgewertet werden

SQL ist eine deklarative Programmiersprache. Im Gegensatz zu beispielsweise C++, einer Programmiersprache Imperativ.

Das heißt, Sie können es sagen was Sie wollen im Endergebnis, aber Sie können nicht diktieren wie das Ergebnis wird ausgeführt, es liegt alles an der Engine.

Der einzig wahre Weg, um einen "Kurzschluss" (oder einen anderen Kontrollfluss) innerhalb von WHERE zu gewährleisten, besteht darin, indizierte Ansichten, temporäre Tabellen und ähnliche Mechanismen zu verwenden.

PS. Sie können auch Hinweise zum Ausführungsplan verwenden (um der Engine zu "verweisen", wie eine Abfrage ausgeführt wird, welche Indizes verwendet werden sollen und wie sie verwendet werden sollen). Ich dachte nur, ich sollte es erwähnen, während wir uns mit diesem Thema befassen ...

0
jitbit