Sehr einfache Frage Ich hoffe, ich habe derzeit einige Skripte, die ich in mein Projekt geerbt habe, die von den Datenbankadministratoren überprüft wurden. Dies wurde anscheinend noch nie zuvor gemacht und es werden viele Probleme gefunden.
Ich bin ein bisschen neu in diesem Bereich, aber mein Verständnis von Sargable und Non-Sargable SQL ist, dass die fehlerhafte Funktion für die Spalte ausgeführt wird und somit den Index blockiert (vorausgesetzt, einer ist vorhanden), was zu einem Scan der Spalte und a führt Leistungseinbruch. Der Code hat mehrere Funktionen in der Eingabe, viele kleinere Dinge, wie
Where a.date between 'inputdate' and dateadd(day,1,'inputdate')
Der DBA hat die Auffassung vertreten, dass jede Abfrage, die eine Funktion in der WHERE
Klausel enthält, nicht saragierbar ist. Ich werde das Problem mit ihm fallen lassen, weil mich das Streiten nirgendwohin bringt, außer einem verärgerten Administrator und meinem eingeschränkten Zugriff.
Aber gibt es aus Wissensgründen einen Fall, in dem er korrekt ist und jede in der WHERE
Klausel enthaltene Funktion ein Problem darstellt, unabhängig von Funktion oder Platzierung?
BETWEEN
mit Datumsangaben verwenden, aber das ist ein anderes, nicht verwandtes Problem.) Sie zeigen uns jedoch nur eine Abfrage. Wenn Sie Dutzende von Abfragen mit nicht sargierbaren Bedingungen und Funktionsaufrufen haben, haben sie möglicherweise die tatsächlich sargable verpasst.Antworten:
Wie ypercube kommentierte
Sie können dies überprüfen, indem Sie:
Sobald Sie die Beweise haben, schlage ich vor, dass Sie sie mit dem DBA aufnehmen. Lassen Sie sich jedoch nicht auf einen Streit ein. Zeigen Sie einfach den Test und die Daten, die zeigen, dass der Index verwendet wird.
Der Punkt ist, dass Sie nicht gezwungen werden möchten, sich nach hinten zu beugen, um nicht vorhandene Probleme zu vermeiden.
Glücklicherweise ist es in dem von Ihnen demonstrierten Fall kein Problem, die Funktionen außerhalb der Abfrage zu verschieben. Z.B
In der Tat kann das Obige auf lange Sicht sogar wartbarer sein.
Es wird jedoch eine Zeit kommen, in der Sie etwas haben, das nicht trivial nach den Wünschen des DBA geändert werden kann. Sowie:
Die einzige Möglichkeit, diese Funktion aus der WHERE-Klausel herauszuholen, besteht darin, eine andere Spalte vorab zu berechnen
b.NextDay
. Genau aus diesem Grund benötigen Sie die Datenbankadministratoren, um die Sargabilität richtig zu verstehen. Dh das oben genannte:a.date
.b.date
.Wenn Sie wirklich kein Buy-In von den DBAs erhalten können, funktioniert möglicherweise Folgendes und umgeht deren Regeln für den Frachtkult:
Der Optimierer wird dies mit ziemlicher Sicherheit auf die gleiche Weise optimieren, als ob die Funktion in der
WHERE
Klausel enthalten wäre, sodass Sie keinen Leistungsverlust erhalten sollten. Aber es ist sicherlich eine unnötige Verringerung der Wartbarkeit.quelle
WITH
wird nicht funktionieren ... zumindest vorerst nicht. Alle Abfragen werden über ein Berichtssystem ausgeführt, das vordefinierte Anweisungen akzeptiert. Die gleichen, die ich geerbt habe. Mein ultimativer Plan ist es, alles auf Skripte zu verschieben, die die Arbeit automatisch erledigen und derzeit manuell ausgeführt werden. Ja, die Datenbankadministratoren können CTEs verwenden, und tatsächlich haben sie einen Plan wie Ihren vorgeschlagen. Und ich möchte nicht mit ihnen in einen Pisswettbewerb geraten, weil sie das Leben schwer machen können.