Naast de niet-deterministische functie, is het probleem dat ik zie, dat je berekeningen maakt op een veld. Dit maakt (meestal) elke index op het veld onbruikbaar door de zoekopdracht.
De tweede alinea van deze link (Tien veelvoorkomende SQL-programmeerfouten (functies op geïndexeerde kolommen in predikaten) ) geeft meer gedetailleerde informatie over wanneer dit gebeurt, hoe u dit kunt vermijden en hoe optimizers soms indexen kunnen gebruiken ondanks het gebruik van functies.
Kortom, in plaats van te vertrouwen op verbeterde optimizers, is het vaak mogelijk om de query te wijzigen door het veld intact te houden (zonder er berekeningen op uit te voeren), maar in plaats daarvan de (omgekeerde) berekeningen uit te voeren naar de andere waarden. In uw geval tot de huidige datum die wordt verstrekt door GetDate()
. Dan kan de query de index van het veld table1.Date
. gebruiken .
U kunt dus iets gebruiken als:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
En u hoeft alleen maar functies te vinden waarmee u de eerste en laatste dag van de huidige maand krijgt.
Deze blogpost kan je helpen:sql-server-query-to-find-first-and-last-day-of-current-month/
Nog beter, deze StackOverflow vraag/antwoord:eenvoudigste-manier-om-een-datum-die-de-eerste-dag-van-de-maand-is-aan-te-maken -een andere datum
Ik zal het moeten testen, maar ik denk dat deze kleine variatie op het bovenstaande voldoende is:
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)