Além da função não determinística, o problema que vejo é que você faz cálculos em um campo. Isso (geralmente) torna qualquer índice no campo inutilizável pela consulta.
O segundo parágrafo deste link (Dez erros comuns de programação SQL (funções em colunas indexadas em predicados) ) fornece informações mais detalhadas sobre quando isso acontece, como evitá-lo e como às vezes os otimizadores podem usar índices apesar do uso de funções.
Resumindo, em vez de contar com otimizadores aprimorados, muitas vezes é possível alterar a consulta mantendo o campo intacto (sem fazer cálculos nele), mas fazendo os cálculos (invertidos) para os outros valores. No seu caso, para a data atual fornecida por
GetDate()
. Então a consulta pode usar o índice do campo table1.Date
. Então, você pode usar algo como:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
E você só precisa encontrar funções que o levem ao primeiro e ao último dia do mês atual.
Esta postagem do blog pode ajudá-lo:sql-server-query-to-find-first-and-last-day-of-current-month/
Melhor ainda, esta pergunta/resposta do StackOverflow:maneira-maissimples-de-criar-uma-data-que-é-o-primeiro-dia-do-mês-dado -outra data
Vou ter que testar, mas acho que essa pequena variação do acima vai fazer:
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)