2013-01-24 17 views
8

Ho un numero di giorni variabile che voglio confrontare con una colonna datetime (senddate).Prestazioni Datediff

Al momento sto facendo questo:

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

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

Quindi, in pratica tutto ciò che è più vecchio di 10 giorni dovrebbe vengono eliminati, abbiamo indice sulla colonna sendDate ma ancora la velocità è molto più lento, so che il lato sinistro non dovrebbe calcolo per motivi di prestazioni, ma qual è il modo ottimale per risolvere altrimenti questo problema?

+0

come si effettua la query "SARGable" in questo caso? –

risposta

12

L'espressione

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

non sarà in grado di utilizzare un indice sulla colonna senddate, a causa della funzione sul lato sinistro su senddate

Al fine di rendere la clausola WHERE 'SARGable' (cioè in grado di utilizzare un indice), passare alla condizione equivalente:

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

[Grazie a @Krystian Lieber, per sottolineare incorr condizione ect].

+0

+1 per sargable – WKordos

+1

penso che la condizione dovrebbe essere DOVE senddate DateAdd (dd, @CalculationInterval, @RunDate) per @ RunDate = '2013-01-11' e @ CalculationInterval = 10 eliminiamo tutte le righe con senddate> '2013-01-21' quando penso che vorremmo eliminare tutte le righe con senddate <'2013-01-01' –

+0

@Krystian Lieber - Corretto, ho già apportato questo cambiamento alla mia estremità, volevo solo avere un'idea di come renderlo sargable :) –