Kromě nedeterministické funkce vidím problém v tom, že provádíte výpočty na poli. To (obvykle) způsobí, že jakýkoli index v poli nebude pro dotaz použitelný.
Druhý odstavec tohoto odkazu (Deset běžných chyb programování SQL (funkce v indexovaných sloupcích v predikátech) ) poskytuje podrobnější informace o tom, kdy se to stane, jak se tomu vyhnout a jak někdy mohou optimalizátory používat indexy navzdory použití funkcí.
Stručně řečeno, namísto spoléhání se na vylepšené optimalizátory je často možné změnit dotaz tak, že pole ponecháte nedotčené (aniž byste s ním prováděli žádné výpočty), ale místo toho prováděli (obrácené) výpočty s ostatními hodnotami. Ve vašem případě k aktuálnímu datu, které poskytuje GetDate()
. Pak může dotaz použít index pole table1.Date
.
Takže můžete použít něco jako:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
A stačí najít funkce, které vám poskytnou první a poslední den aktuálního měsíce.
Tento příspěvek na blogu vám může pomoci:sql-server-query-k-najít-první-a-poslední-den-aktuálního-měsíce/
Ještě lepší je tato otázka/odpověď StackOverflow:nejjednodušší způsob, jak-vytvořit-datum-které-je-první-den-v-měsíci-dán -další-datum
Budu muset otestovat, ale myslím, že tato malá variace výše uvedeného bude stačit:
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)