Eu tenho construído procedimentos armazenados e não consigo encontrar nenhuma documentação sobre como o otimizador do SQL Server lida com tabelas #temp.
Se eu tiver 4 junções a uma tabela #temp onde essa tabela #temp é criada DURANTE a execução do procedimento armazenado e a tabela #temp pode conter de zero a muitos registros, como isso é estimado?
Estima-se que seja tão grande quanto algumas das tabelas na junção, já que não há estatísticas no momento de CREATE/ALTER? Estima-se que seja pequeno? Estima-se que seja como outras mesas #temporárias?
Observe que isso está assumindo que não há recompilação no tempo de execução e que o original é usado.
O SQL Server geralmente cria um conjunto completo de planos de execução para as instruções em um procedimento armazenado antes que o procedimento comece a ser executado.
Essa abordagem é ligeiramente modificada quando as tabelas temporárias estão presentes:
Da documentação sobre Recompilando Planos de Execução :
e da Compilação Diferida de Variáveis de Tabela :
Esse é o esboço básico, mas não toda a história.
Como já apontado em outra resposta , tabelas temporárias em procedimentos armazenados também podem ser armazenadas em cache para reutilização . Esse armazenamento em cache pode melhorar significativamente o desempenho e a escalabilidade, mas complica as condições para recompilação do plano e como as informações estatísticas são mantidas.
Descrevo essas complexidades adicionais para o leitor interessado (e avançado) em Cache de Tabela Temporária Explicado e Cache de Tabela Temporária em Procedimentos Armazenados .
Grosso modo, as estimativas de cardinalidade para a criação de estatísticas em tabelas #temp seguem as de tabelas regulares e não temporárias. Dito isto, como Paul White aponta aqui , tabelas temporárias dentro de procedimentos armazenados podem sofrer com valores de estatísticas em cache.
Na página acima, a conclusão mais importante é:
Sugiro dar uma olhada no post para entender completamente como você pode ser afetado pelo cache de tabela temporária.