VAR INTE frestad att göra sådant här:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Det här är ett bättre sätt:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
se:Vad betyder ordet "SARGable" egentligen?
EDIT +Det finns två grundläggande skäl för att undvika användning av funktioner på data i where-klausulen (eller i join-villkor).
- I de flesta fall tar användning av en funktion på data för att filtrera eller sammanfoga bort möjligheten för optimeraren att komma åt ett index i det fältet, vilket gör frågan långsammare (eller mer "kostsam")
- Det andra är att för varje rad med data som är involverad utförs minst en beräkning. Det kan vara att lägga till hundratals, tusentals eller många miljoner beräkningar till frågan så att vi kan jämföra med ett enda kriterium som
2014-02-07
. Det är mycket mer effektivt att ändra kriterierna så att de passar data istället.
"Ändra kriterierna för att passa uppgifterna" är mitt sätt att beskriva "använd SARGABLE
predikat"
Och använd inte mellan heller.
den bästa praxisen med datum- och tidsintervall är att undvika BETWEEN och att alltid använda formuläret:
WHERE col>='20120101' AND col <'20120201' Detta formulär fungerar med alla typer och alla precisioner, oavsett om tidsdelen är tillämplig.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)