Además de la función no determinista, el problema que veo es que haces cálculos en un campo. Esto (generalmente) hace que cualquier índice en el campo sea inutilizable por la consulta.
El segundo párrafo de este enlace (Diez errores comunes de programación SQL (funciones en columnas indexadas en predicados) ) proporciona información más detallada sobre cuándo sucede esto, cómo evitarlo y cómo a veces los optimizadores pueden usar índices a pesar del uso de funciones.
En resumen, en lugar de confiar en optimizadores mejorados, a menudo es posible cambiar la consulta manteniendo el campo intacto (sin hacer ningún cálculo en él), pero haciendo los cálculos (inversos) a los otros valores. En su caso, a la fecha actual proporcionada por GetDate()
. Entonces la consulta puede usar el índice del campo table1.Date
.
Entonces, puedes usar algo como:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
Y solo necesita encontrar funciones que le proporcionen el primer y último día del mes actual.
Esta publicación de blog puede ayudarlo:sql-server-query-to-find-first-and-ult-day-of-current-month/
Aún mejor, esta pregunta/respuesta de StackOverflow:manera-más-sencilla-de-crear-una-fecha-que-sea-el-primer-día-del-mes-dada -otra-fecha
Tendré que probar, pero creo que esta ligera variación de lo anterior servirá:
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)