Eu tenho a seguinte consulta que une dados dinâmicos de várias tabelas muito grandes e é executado muito lentamente. Tentei criar a tabela temporária para cada giro e ela roda muito mais rápido. É uma maneira de forçar o spool de índice/tabela sem criar tabelas temporárias?
select ...
from T1 ....
left join (select ... from (select ... from T2....) pivot (sum(C1) on C2 in (...))) p1
on ...
left join (select ... from (select ... from T3....) pivot (sum(...) on ... in (...))) p2
on ...
left join (select ... from (select ... from T4....) pivot (sum(...) on ... in (...))) p3
on ...
Uma pergunta muito semelhante foi feita e respondida no StackOverflow: Como posso forçar uma subconsulta a funcionar tão bem quanto uma tabela #temp? Para resumir,
#temp
mesa e materializá-la você mesmo.TOP(large_number) ... ORDER BY
muitas vezes pode encorajar o resultado a ser colocado em spool em vez de repetidamente reavaliado. Mesmo que funcione, no entanto, não há estatísticas no carretel.O SQL Server não tem uma dica force_spool.
Você pode "codificar" manualmente um plano de execução que inclua um spool e, em seguida, forçar seu uso com uma dica de plano. No entanto, ainda não experimentei esse método.
Editar:
A codificação manual de um plano de execução está além do escopo deste fórum. Aqui estão algumas dicas para você começar:
A melhor maneira de começar é ler planos de execução XML simples.
Para colocar um carretel lá, você deve ser capaz de injetar um carretel em qualquer lugar que faça sentido. O plano de execução, no entanto, será verificado pelo SQL Server para ser válido para a consulta em questão e pode ser rejeitado.
Novamente, esta é apenas uma sugestão de pesquisa e eu ainda não tentei.
O que há de errado em persistir os resultados intermediários em uma tabela temporária? Muitas vezes, é uma abordagem sólida ao ajustar o desempenho. Pode não fornecer a consulta mais rápida em comparação com uma consulta in-line "perfeita", mas proporcionará resultados mais previsíveis.
Suspeito que você esteja enfrentando um problema de cardinalidade devido à complexidade da consulta. Você tem grandes discrepâncias entre as contagens de linhas estimadas e reais em seu plano de execução? Você pode postar seu XML do Plano de Execução Real? Enquanto isso, uma das dicas de consulta pode ajudar, por exemplo
No meu equipamento simples , isso gerou uma consulta mais rápida, mas com uso mais intenso da CPU. Eu realmente não posso recomendar cortar seu próprio plano de execução. Levaria cerca de 30 segundos para refatorar sua consulta para trabalhar com tabelas temporárias, nas quais você poderia passar horas mexendo no xml do plano de execução e ainda assim não obter um resultado.