Ich habe eine Abfrage für eine große Tabelle, die so aussieht:
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
In der where-Klausel gibt es mehrere ähnliche Bedingungen wie diese, und es gibt auch viele Verknüpfungen, aber dies ist eine Zusammenfassung.
Wenn @myIdParam null ist, möchten wir die Ergebnisse mit diesem Parameter nicht einschränken.
Ich bin kein DB-Profi, aber aus meinen Tests geht hervor, dass diese NULL-Prüfung für jeden Datensatz durchgeführt und in keiner Weise optimiert wird.
Wenn ich die Nullprüfung entferne und davon ausgehe, dass der Parameter nicht null ist, wird die Abfrage sofort zurückgegeben. Andernfalls dauert es bis zu zehn Sekunden.
Gibt es eine Möglichkeit, dies zu optimieren, sodass die Überprüfung zur Laufzeit nur einmal durchgeführt wird?
sql-server
null
Mystagoge
quelle
quelle
OPTION(RECOMPILE)
Antworten:
Eine Möglichkeit besteht darin, dynamisches SQL zu verwenden und eine Nullprüfung zu verwenden, um optional diesen Teil der where-Klausel hinzuzufügen.
quelle
sp_ExecuteSQL
fehlt und der@vc_dynamicsql
Parameter a sein mussNVARCHAR
.Jedes Mal, wenn Sie eine Funktion um eine Spalte "ISNULL (@var, table.col)" setzen, entfernen Sie beispielsweise die Fähigkeit von SQL, einen Index zu verwenden. Dies ist wirklich die leistungsstärkste Option, wenn Sie sie in einer einzelnen Abfrage behalten möchten.
Ansonsten haben Sie zwei Möglichkeiten. Das erste ist dynamisches SQL und die Antwort von @ Mystagogue reicht dafür aus, andernfalls können Sie zwei Abfragen wie diese eingeben:
Sowohl in diesem Format als auch in dynamischem SQL erhalten Sie für jede Abfrage einen anderen Abfrageplan (was möglicherweise zu einer besseren Leistung führt).
quelle
Ja, du kannst:
Beachten Sie jedoch, dass die
nullif()
Funktion im Wesentlichen ein Wrapper istcase
. Es ist keine Silberkugel,OR
die die Abfrage auf magische Weise eliminiert und damit beschleunigt.quelle
UNION
s zurückzugreifen. Als ich genau diese Aufgabe hatte, entschied ich mich für dynamisches SQL.