Existem algumas explicações possíveis sobre por que você vê esse comportamento. Alguns comuns são
- A subconsulta ou CTE pode estar sendo reavaliada repetidamente.
- Materializando resultados parciais em um
#temp
table pode forçar uma ordem de junção mais otimizada para essa parte do plano, removendo algumas opções possíveis da equação. - Materializando resultados parciais em um
#temp
tabela pode melhorar o restante do plano corrigindo estimativas de cardinalidade ruins.
O método mais confiável é simplesmente usar um
#temp
mesa e materialize-a você mesmo. Caso contrário, em relação ao ponto 1, consulte Fornecer uma dica para forçar a materialização intermediária de CTEs ou tabelas derivadas . O uso de
TOP(large_number) ... ORDER BY
muitas vezes pode encorajar o resultado a ser colocado em spool em vez de repetidamente reavaliado. Mesmo que isso funcione, não há estatísticas sobre o carretel.
Para os pontos 2 e 3, você precisaria analisar por que não estava obtendo o plano desejado. Possivelmente, reescrever a consulta para usar predicados sargáveis ou atualizar estatísticas pode obter um plano melhor. Caso contrário, você pode tentar usar dicas de consulta para obter o plano desejado.