Nenechte se v pokušení dělat takové věci:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Toto je lepší způsob:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
viz:Co skutečně znamená slovo „SARGable“?
EDIT +Existují 2 základní důvody, proč se vyhnout použití funkcí na datech v klauzuli where (nebo v podmínkách spojení).
- Ve většině případů použití funkce na datech k filtrování nebo spojení odebere možnost optimalizátoru získat přístup k indexu v tomto poli, čímž se dotaz zpomalí (nebo je "nákladnější")
- Druhou možností je, že pro každý řádek příslušných dat se provádí alespoň jeden výpočet. To by mohlo znamenat přidání stovek, tisíců nebo mnoha milionů výpočtů do dotazu, abychom mohli porovnat s jediným kritériem, jako je
2014-02-07
. Je mnohem efektivnější změnit kritéria tak, aby vyhovovala datům.
"Úprava kritérií tak, aby vyhovovala údajům" je můj způsob, jak popsat "použijte SARGABLE
predikáty"
A nepoužívejte mezi oběma.
nejlepším postupem s rozsahem data a času je vyhnout se BETWEEN a vždy používat formulář:
WHERE col>='20120101' AND col <'20120201' Tento formulář pracuje se všemi typy a přesností, bez ohledu na to, zda je časová část použitelná.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Itzik Ben-Gan)