Poza funkcją niedeterministyczną, problem, który widzę, polega na tym, że wykonujesz obliczenia na polu. To (zazwyczaj) sprawia, że żaden indeks w polu nie nadaje się do użycia przez zapytanie.
Drugi akapit tego linku (Dziesięć typowych błędów programowania SQL (funkcje na indeksowanych kolumnach w predykatach) ) zawiera bardziej szczegółowe informacje o tym, kiedy tak się dzieje, jak tego uniknąć i jak czasami optymalizatorzy mogą używać indeksów pomimo korzystania z funkcji.
Krótko mówiąc, zamiast polegać na ulepszonych optymalizatorach, często można zmienić zapytanie, zachowując nienaruszone pole (bez wykonywania na nim żadnych obliczeń), ale zamiast tego wykonując (odwrócone) obliczenia na inne wartości. W twoim przypadku do aktualnej daty podanej przez GetDate()
. Wtedy zapytanie może użyć indeksu pola table1.Date
.
Możesz więc użyć czegoś takiego:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
Musisz tylko znaleźć funkcje, które zapewnią Ci pierwszy i ostatni dzień bieżącego miesiąca.
Ten wpis na blogu może Ci pomóc:zapytanie-do-serwera-sql, aby znaleźć-pierwszy-i-ostatni-dzień-bieżącego-miesiąca/
Co więcej, to pytanie/odpowiedź StackOverflow:najprostszy-sposób-utworzenia-daty-której-jest-pierwszy-dzień-miesiąca-podany -inna-data
Będę musiał przetestować, ale myślę, że ta niewielka zmiana powyższego wystarczy:
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)