Was ist der effiziente Weg, um nach einer Null oder einem Wert für eine Spalte in der SQL-Abfrage zu suchen? Betrachten Sie eine SQL-Tabelle table
mit der Ganzzahlspalte column
, die einen Index hat. @value
kann eine ganze Zahl oder null sein ex: 16 oder null.
Abfrage 1: Nicht sicher, aber es scheint, man sollte sich nicht auf den Kurzschluss in SQL verlassen. Die unten stehende Abfrage funktioniert jedoch immer korrekt, wenn @value
eine Ganzzahl oder Null ist.
Die folgende Abfrage ist eine erweiterte Version der obigen Abfrage. Es funktioniert auch richtig.
%Vor%Würden die obigen 2 Abfragen den Vorteil des Index nutzen?
Abfrage 2: Die folgende Abfrage vergleicht die Spalte mit nicht-null @value
else vergleicht die Spalte column
mit sich selbst, die immer wahr ist und alles zurückgibt. Es funktioniert auch richtig. Würde diese Abfrage den Index nutzen?
Was ist der beste Weg?
Hinweis: Wenn die Antwort mit Datenbanken variiert, interessiert mich MS-SQL.
Variationen zu dieser Frage sind in den letzten paar Tagen mehrmals aufgetreten (warum passieren diese Dinge immer in Gruppen?). Die kurze Antwort lautet: Ja, SQL Server wird die Logik kurzschließen, wenn der Abfrageplan mit bekannten Werten erstellt wird. Also, wenn Sie diesen Code in einem Skript haben, wo die Variablen gesetzt sind, dann glaube ich, dass es die Logik kurzschließen sollte (Test, um sicher zu sein). Wenn es sich jedoch um eine gespeicherte Prozedur handelt, erstellt SQL Server im Voraus einen Abfrageplan, und es weiß nicht, ob es die Abfrage kurzschließen kann oder nicht, weil es die Parameterwerte zum Zeitpunkt der Generierung nicht kennt der Abfrageplan.
Unabhängig davon, ob es sich um einen Kurzschluss handelt oder nicht, SQL Server sollte den Index verwenden können, wenn dies der einzige Teil Ihrer Abfrage ist. Wenn die Variable jedoch NULL ist, möchten Sie wahrscheinlich nicht, dass SQL Server den Index verwendet, da dies nutzlos ist.
Wenn Sie sich in einer gespeicherten Prozedur befinden, sollten Sie OPTION (RECOMPILE) für Ihre Abfrage verwenden. Dies führt dazu, dass SQL Server jedes Mal einen neuen Abfrageplan erstellt. Dies ist ein wenig Overhead, aber die Gewinne überwiegen in der Regel deutlich. Dies ist NUR gut für SQL 2008 und selbst dann nur für einige der späteren Service Packs. Es gab einen Bug mit RECOMPILE, bevor es unbrauchbar gemacht wurde. Für weitere Informationen besuchen Sie bitte den großartigen Artikel von Erland Sommarskog zu diesem Thema. Insbesondere sollten Sie unter den Abschnitten für statische SQL suchen.
Um einen Punkt zu verdeutlichen, hat SQL nicht wirklich einen Kurzschluss, wie wir ihn in C-basierten Sprachen kennen. Was wie ein Kurzschluss aussieht, ist wirklich, dass in der ternären Logik von SQL Server TRUE OR NULL zu TRUE
ausgewertet wird %Vor%ZB:
%Vor%Tags und Links sql-server comparison tsql null