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.