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

Usando com vs declare uma tabela temporária:desempenho/diferença?


A @table sintaxe cria uma variável de tabela (uma tabela real em tempdb ) e materializa os resultados para ele.

O WITH sintaxe define uma Expressão de tabela comum que não é materializado e é apenas uma visualização embutida.

Na maioria das vezes, seria melhor usar a segunda opção. Você mencionou que isso está dentro de uma função. Se este for um TVF, na maioria das vezes você deseja que eles sejam inline em vez de instruções múltiplas para que possam ser expandidos pelo otimizador - isso não permitiria instantaneamente o uso de variáveis ​​de tabela.

Às vezes, no entanto (digamos que a consulta subjacente é cara e você deseja evitar que ela seja executada várias vezes), você pode determinar que a materialização dos resultados intermediários melhora o desempenho em alguns casos específicos. Existe atualmente de jeito nenhum de forçar isso para CTEs (sem forçar um guia de plano pelo menos )

Nessa eventualidade você (em geral) tem 3 opções. Uma @tablevariable , #localtemp tabela e um ##globaltemp tabela. No entanto, apenas o primeiro deles é permitido para uso dentro de uma função.

Para obter mais informações sobre as diferenças entre variáveis ​​de tabela e #temp tabelas veja aqui .