Förutom den icke-deterministiska funktionen är problemet jag ser att man gör beräkningar på ett fält. Detta gör (vanligtvis) alla index i fältet oanvändbara av frågan.
Det andra stycket i denna länk (Tio vanliga SQL-programmeringsmisstag (funktioner på indexerade kolumner i predikat) ) ger mer detaljerad information om när detta händer, hur man undviker det och hur ibland optimerare kan använda index trots användning av funktioner.
Kort sagt, istället för att förlita sig på förbättrade optimerare, är det ofta möjligt att ändra frågan genom att hålla fältet intakt (utan att göra några beräkningar på det), men istället göra de (omvända) beräkningarna till de andra värdena. I ditt fall till det aktuella datumet som tillhandahålls av GetDate()
. Då kan frågan använda indexet för fältet table1.Date
.
Så du kan använda något som:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
Och du behöver bara hitta funktioner som ger dig den första och sista dagen i innevarande månad.
Det här blogginlägget kan hjälpa dig:sql-server-query-to-find-first-and-last-day-of-current-month/
Ännu bättre, denna StackOverflow-fråga/svar:enklaste-sättet-att-skapa-ett-datum-som-är-den-första-dagen-i-månaden-given -ett annat-datum
Jag måste testa men jag tror att denna lilla variation av ovanstående kommer att göra:
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)