Apaguei minha pergunta antiga para ser mais preciso sobre o que preciso.
temos uma grande consulta contendo muitas consultas menores. Esta consulta funciona muito bem, até chegar à cláusula "have max":
having
max
(
DateField
) < getdate() - @2_years_ago
existe alguma cláusula que pode ser mais rápida do que ter max? porque isso está causando uma varredura de índice e looping e looping sem parar pelos milhões de linhas que existem na tabela.
tentei fazer por row_number mas não tive sorte.
E só noto que essa mesma consulta roda muito bem em outros bancos de dados com a mesma estrutura.
apenas este (que curiosamente tem menos linhas) não funciona.
Dbs no mesmo servidor.
Parece que seu principal problema é que a estimativa de cardinalidade ruim está fazendo com que o compilador reordene as junções. Isso parece estar acontecendo mais quando você usa
OPTION (RECOMPILE)
, porque o servidor está fazendo estimativas diferentes.Você deve ser capaz de simplificar sua consulta atual o suficiente para que o compilador ache mais fácil
Sem ver seu esquema, é difícil dizer exatamente, mas parece que você pode inverter a
EXISTS
lógica paraNOT EXISTS
.HAVING
para encontrar a data máxima.Sua consulta existente tem vários problemas:
a
b
c
são aliases bobos, considere usar outros mais significativos.[]
para citar nomes de coluna, não''
. Não cite a menos que você precise.NOLOCK
espalhado em todos os lugares como confete, o que você espera alcançar com isso? Tem implicações muito sérias para a integridade dos dados. Considere usarTABLOCK
dicas em vez disso, ouSNAPSHOT
isolamento.EXISTS
subconsulta não precisa selecionar nada, na verdade ela é ignorada. Você pode simplesmente fazerEXISTS (SELECT 1
.where b.[MerchantLogId] = a.[MerchantLogId] group by b.[MerchantLogId]
não faz sentido: você sempre terá exatamente um grupo, então não há necessidade degroup by
.NTFM_MerchantLog
nas subconsultas, porque isso é unido pela chave primária.DATEADD
Também parece que você pode combinar as três subconsultas em uma, juntando todas as tabelas e usando
OR
(para isso, você ainda precisará de algumas associações à esquerda).Espero que, depois de fazer todas essas melhorias, você veja um desempenho melhor