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

Como posso forçar uma subconsulta a funcionar tão bem quanto uma tabela #temp?


Existem algumas explicações possíveis sobre por que você vê esse comportamento. Alguns comuns são
  1. A subconsulta ou CTE pode estar sendo reavaliada repetidamente.
  2. 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.
  3. 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.