Laat je niet verleiden om dit soort dingen te doen:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Dit is een betere manier:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
zie:Wat betekent het woord "SARGable" eigenlijk?
EDIT +Er zijn 2 fundamentele redenen om het gebruik van functies op gegevens in de waar-clausule (of in samenvoegvoorwaarden) te vermijden.
- In de meeste gevallen verwijdert het gebruik van een functie op gegevens om te filteren of samen te voegen de mogelijkheid van de optimizer om toegang te krijgen tot een index op dat veld, waardoor de zoekopdracht langzamer (of "duurder") wordt
- De andere is dat er voor elke betrokken rij gegevens minstens één berekening wordt uitgevoerd. Dat kan het toevoegen van honderden, duizenden of vele miljoenen berekeningen aan de zoekopdracht zijn, zodat we kunnen vergelijken met een enkel criterium zoals
2014-02-07
. Het is veel efficiënter om in plaats daarvan de criteria aan te passen aan de gegevens.
"De criteria aanpassen aan de gegevens" is mijn manier om te beschrijven "gebruik SARGABLE
predikaten"
En ook niet tussen gebruiken.
de beste werkwijze met datum- en tijdbereiken is om TUSSEN en altijd het formulier te gebruiken:
WHERE col>='20120101' AND col <'20120201' Dit formulier werkt met alle typen en alle precisies, ongeacht of het tijdsdeel van toepassing is.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)