2013-01-24 13 views
8

Mam zmienną liczbę dni, które chcę porównać z datetime kolumna (senddate).Datediff performance

Im obecnie to robi:

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

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

więc w zasadzie wszystko, co jest starsze niż 10 dni powinno się usunąć, mamy indeks na kolumnie sendDate ale prędkość jest znacznie wolniejsze, wiem, że lewa strona nie powinna mieć obliczenia ze względu na wydajność, ale jaki jest optymalny sposób rozwiązania tego problemu w inny sposób?

+0

Jak w takim razie utworzyć zapytanie "SARGable"? –

Odpowiedz

12

Wyrażenie

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

nie będzie w stanie użyć indeks kolumny senddate, ze względu na funkcję w LHS na senddate

aby uczynić klauzuli WHERE „SARGable” (czyli w stanie użyć indeksu), zmieni się na równoważny stan:

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

[Dzięki @Krystian Lieber, za wskazanie incorr ect warunek].

+0

+1 do sargable – WKordos

+1

myślę warunek ten powinien być GDZIE senddate DateAdd (dd, @CalculationInterval, @RunDate) dla @ RunDate = "2013-01-11" i @ CalculationInterval = 10 usuwamy wszystkie wiersze z senddate> '2013-01-21' kiedy myślę, że chcielibyśmy usunąć wszystkie wiersze z senddate <'2013-01-01' –

+0

@Krystian Lieber - Prawidłowo już dokonałem tej zmiany po mojej stronie, chciałem tylko zorientować się, jak ją sfabrykować :) –