NON essere tentato di fare cose come questa:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Questo è un modo migliore:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
vedi:cosa significa veramente la parola "SARGable"?
EDIT +Ci sono 2 ragioni fondamentali per evitare l'uso di funzioni sui dati nella clausola where (o nelle condizioni di join).
- Nella maggior parte dei casi, l'utilizzo di una funzione sui dati da filtrare o unire rimuove la capacità dell'ottimizzatore di accedere a un indice su quel campo, rendendo così la query più lenta (o più "costosa")
- L'altro è che per ogni riga di dati coinvolta viene eseguito almeno un calcolo. Potrebbe essere l'aggiunta di centinaia, migliaia o molti milioni di calcoli alla query in modo da poter confrontare un singolo criterio come
2014-02-07
. È invece molto più efficiente modificare i criteri per adattarli ai dati.
"Modificare i criteri per adattarli ai dati" è il mio modo di descrivere "usa SARGABLE
predicati"
E non usare tra nessuno dei due.
la migliore pratica con intervalli di data e ora è evitare TRA e utilizzare sempre il modulo:
WHERE col>='20120101' AND col <'20120201' Questo modulo funziona con tutti i tipi e tutte le precisioni, indipendentemente dal fatto che la parte temporale sia applicabile.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)