Ist diese Datumsvergleichsbedingung in SQL SARG-fähig?

7

Ist diese Bedingung sargable?

%Vor%

Meine Faustregel ist, dass eine Funktion auf der linken Seite Bedingung nicht sargable macht .. aber an einigen Stellen habe ich gelesen, dass BETWEEN-Klausel sargable ist. Weiß jemand das sicher?

Als Referenz:

HINWEIS: Wenn hier ein Guru endet, aktualisieren Sie bitte die Sargable-Wikipedia-Seite. Ich habe es ein wenig aktualisiert, aber ich bin mir sicher, dass es mehr verbessert werden kann:)

    
Oscar Foley 01.06.2012, 16:08
quelle

2 Antworten

18

Wenn wir in AdventureWorks diese zwei äquivalenten Abfragen betrachten:

%Vor%

In beiden Fällen sehen wir einen Clustered-Index-Scan:

Beachten Sie jedoch den empfohlenen / fehlenden Index nur für die letzte Abfrage, da dies der einzige ist, der davon profitieren könnte:

Wenn wir der Spalte OrderDate einen Index hinzufügen, führen Sie die Abfragen erneut aus:

%Vor%

Wir sehen viel Unterschied - letzterer verwendet eine Suche:

Beachten Sie auch, dass die Schätzungen für Ihre Version der Abfrage weit entfernt sind. Dies kann bei einem großen Datensatz absolut katastrophal sein.

Es gibt nur sehr wenige Fälle, in denen eine Funktion oder ein anderer auf die Spalte angewendeter Ausdruck sargierbar ist. Ein Fall, den ich kenne, ist CONVERT(DATE, datetime_column) - aber diese spezielle Optimierung ist undokumentiert, und ich empfehle, trotzdem wegzubleiben. Nicht nur, weil Sie implizit vorschlagen, dass die Verwendung von Funktionen / Ausdrücken gegen Spalten in Ordnung ist (es ist nicht in jedem anderen Szenario), sondern auch, weil es kann zu verschwendeten Reads und katastrophalen Schätzungen führen .

    
Aaron Bertrand 01.06.2012, 16:24
quelle
8

Ich wäre sehr überrascht, wenn das sargable wäre. Eine Option könnte sein, es wie folgt neu zu schreiben:

%Vor%

Was ich glaube, wird Sargable sein (auch wenn es nicht ganz so hübsch ist).

    
Abe Miessler 01.06.2012 16:19
quelle