Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como melhorar o desempenho da função não determinística de uma coluna em uma cláusula where ou join?


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)