НЕ се изкушавайте да правите неща като това:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
Това е по-добър начин:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
вижте:Какво всъщност означава думата „SARGable“?
РЕДАКТИРАНЕ +Има 2 основни причини за избягване на използването на функции върху данни в клаузата where (или в условия за присъединяване).
- В повечето случаи използването на функция върху данни за филтриране или присъединяване премахва способността на оптимизатора да има достъп до индекс в това поле, което прави заявката по-бавна (или по-скъпа)
- Другият е, че за всеки ред от включени данни се извършва поне едно изчисление. Това може да е добавяне на стотици, хиляди или много милиони изчисления към заявката, така че да можем да сравним с един критерий като
2014-02-07
. Много по-ефективно е вместо това да се променят критериите, за да отговарят на данните.
„Промяна на критериите, за да отговарят на данните“ е моят начин да опиша „използвайте SARGABLE
предикати"
И не използвайте между двете.
най-добрата практика с диапазони от дата и време е да избягвате МЕЖДУ и винаги да използвате формуляра:
WHERE col>='20120101' AND col <'20120201' Този формуляр работи с всички типове и всички прецизности, независимо дали частта от времето е приложима.
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (Ицик Бен-Ган)