2013-01-24 4 views
8

Ich habe eine Anzahl von Tagen Variable, die ich mit einer Datetime-Spalte (senddate) vergleichen möchte.Datediff Leistung

Im momentan dies zu tun:

DECLARE @RunDate datetime = '2013-01-01' 
DECALRE @CalculationInterval int = 10 

DELETE 
FROM TableA 
WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

Also im Grunde alles, was älter als 10 Tage ist, sollten wir Spalt Index auf Senddate erhalten gelöscht, aber immer noch die Geschwindigkeit ist viel langsamer, ich weiß die linke Seite sollte nicht Berechnung aus Leistungsgründen, aber was ist der optimale Weg, dieses Problem anders zu lösen?

+0

Wie mache ich die Abfrage in diesem Fall "SARGable"? –

Antwort

12

Der Ausdruck

WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

einen Index zu verwenden, auf der senddate Spalte, weil der Funktion auf der LHS auf senddate

Um zu machen, die WHERE Klausel ‚Sargable‘ nicht in der Lage sein, (dh der Lage, einen Index zu verwenden), in die entsprechende Bedingung ändern:

WHERE senddate < dateadd(dd, [email protected], @RunDate) 

[Dank @Krystian Lieber, für den Hinweis auf incorr ect Bedingung].

+0

+1 für sargable – WKordos

+1

ich denke, die Bedingung sein sollte, wo Senddate dateadd (dd, @CalculationInterval, @RunDate) für @ RunDate = '2013-01-11' und @ CalculationInterval = 10 löschen wir alle Zeilen mit senddate> '2013-01-21', wenn ich denke, dass wir alle Zeilen löschen möchten mit senddate <'2013-01-01' –

+0

@Krystian Lieber - Korrekt, dass ich diese Änderung bereits an meinem Ende vorgenommen habe, wollte nur eine Vorstellung davon bekommen, wie man es sargable macht :) –