Minha consulta está um pouco lenta e acho que é por causa da where datediff
função.
WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
(Com essa abordagem pelo menos está usando o índice que criei)
foi antes disso algo assim:
datediff(minute, TB1.stDate), '2017-01-01') <= 0)
Gostaria de entender se há uma maneira melhor de filtrar com datediff.
Minha dúvida é, como está minha consulta já usando o índice, mesmo estando dentro da DATEDIFF
função.
Nunca aplique funções a colunas , isso significa que nenhum índice pode ser usado para uma busca e torna a estimativa de cardinalidade muito difícil. Dizer "usar o índice" não dá uma boa ideia de como ou se isso vale a pena.
Primeiro, para evitar aplicar uma função a uma coluna...
...pode ser reescrito como...
Sua consulta original dizia "encontre qualquer linha em que a diferença entre a data na tabela e agora seja maior que 50 minutos", que se traduz em "encontre qualquer linha em que a data na tabela seja anterior a 50 minutos". Então, subtraí 50 minutos a partir de agora e consultei valores de data mais antigos que isso. Outra resposta mais detalhada aqui .
Suspeito que seu índice esteja sendo verificado porque cobre a consulta (você pode obter melhor do que um palpite se incluir a definição do índice, o restante da consulta e o plano de execução).
Eu tinha me perguntado se seria ainda mais rápido se isso
cláusula era uma variável SQL pré-computada?
Desde então, Erik Darling e Aaron Bertrand me ensinaram que usar uma variável geralmente é pior do que usar a expressão! Obrigado a ambos! Vou deixar esta resposta aqui caso as respostas possam ajudar mais alguém no futuro. Definitivamente leia suas respostas!