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

Existe uma diferença de desempenho entre CTE , Sub-Query, Tabela Temporária ou Variável de Tabela?


SQL é uma linguagem declarativa, não uma linguagem procedural. Ou seja, você constrói uma instrução SQL para descrever os resultados desejados. Você não está dizendo ao mecanismo SQL como para fazer o trabalho.

Como regra geral, é uma boa ideia deixar o mecanismo SQL e o otimizador SQL encontrarem o melhor plano de consulta. Há muitos anos de esforço para desenvolver um mecanismo SQL, então deixe os engenheiros fazerem o que sabem fazer.

Claro, existem situações em que o plano de consulta não é o ideal. Em seguida, você deseja usar dicas de consulta, reestruturar a consulta, atualizar estatísticas, usar tabelas temporárias, adicionar índices e assim por diante para obter melhor desempenho.

Quanto à sua pergunta. O desempenho de CTEs e subconsultas deve, em teoria, ser o mesmo, pois ambos fornecem as mesmas informações ao otimizador de consultas. Uma diferença é que um CTE usado mais de uma vez pode ser facilmente identificado e calculado uma vez. Os resultados podem ser armazenados e lidos várias vezes. Infelizmente, o SQL Server não parece aproveitar esse método básico de otimização (você pode chamar essa eliminação de subconsulta comum).

Tabelas temporárias são um assunto diferente, porque você está fornecendo mais orientações sobre como a consulta deve ser executada. Uma grande diferença é que o otimizador pode usar estatísticas da tabela temporária para estabelecer seu plano de consulta. Isso pode resultar em ganhos de desempenho. Além disso, se você tiver um CTE complicado (subconsulta) usado mais de uma vez, armazená-lo em uma tabela temporária geralmente aumentará o desempenho. A consulta é executada apenas uma vez.

A resposta à sua pergunta é que você precisa experimentar para obter o desempenho esperado, principalmente para consultas complexas que são executadas regularmente. Em um mundo ideal, o otimizador de consultas encontraria o caminho de execução perfeito. Embora muitas vezes o faça, você pode encontrar uma maneira de obter um melhor desempenho.