Освен недетерминираната функция, проблемът, който виждам, е, че правите изчисления върху поле. Това (обикновено) прави всеки индекс в полето неизползваем от заявката.
Вторият параграф на тази връзка (Десет често срещани грешки при програмиране на SQL (Функции върху индексирани колони в предикати) ) предоставя по-подробна информация за това кога се случва това, как да го избегнете и как понякога оптимизаторите могат да използват индекси въпреки използването на функции.
Накратко, вместо да разчитате на подобрени оптимизатори, често е възможно да промените заявката, като запазите полето непокътнато (без да правите каквито и да е изчисления върху него), но вместо това правите (обратни) изчисления към другите стойности. Във вашия случай до текущата дата, предоставена от GetDate()
. След това заявката може да използва индекса на полето table1.Date
.
Така че можете да използвате нещо като:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
И трябва само да намерите функции, които ви дават първия и последния ден от текущия месец.
Тази публикация в блога може да ви помогне:sql-server-query-to-find-first-and-last-day-of-current-month/
Още по-добре, този въпрос/отговор на StackOverflow:най-простият-начин-за-създаване-на-дата-която-е-първият-ден-от-месеца-даден -друга-дата
Ще трябва да тествам, но мисля, че тази малка вариация на горното ще свърши работа:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)