Do msdn :
Ao contrário de uma tabela derivada, uma CTE pode ser auto-referenciada e pode ser referenciada várias vezes na mesma consulta.
Estou usando CTEs bastante, mas nunca pensei profundamente sobre os benefícios de usá-los.
Se eu referenciar um CTE várias vezes na mesma consulta:
- Existe algum benefício de desempenho?
- Se eu estiver fazendo uma associação automática, o SQL Server verificará as tabelas de destino duas vezes?
sql-server
cte
Royi Namir
fonte
fonte
Respostas:
Como regra, um CTE NUNCA melhorará o desempenho .
Um CTE é essencialmente uma visão descartável. Não há estatísticas adicionais armazenadas, nenhum índice, etc. Ele funciona como um atalho para uma subconsulta.
Na minha opinião, eles podem ser facilmente superutilizados (vejo muito uso excessivo de código no meu trabalho). Algumas boas respostas estão aqui, mas se você precisar se referir a algo mais de uma vez, ou mais do que algumas centenas de milhares de linhas, coloque-o em uma
#temp
tabela e indexe-o.fonte
CTE
é uma má escolha, pois os resultados são descartados após a primeira consulta.Um lugar além da recursão, onde acho as CTEs incrivelmente úteis, é ao criar consultas complexas de relatórios. Uso uma série de CTEs para obter trechos dos dados de que preciso e depois combinar na seleção final. Acho que eles são mais fáceis de manter do que fazer a mesma coisa com muitas tabelas derivadas ou 20 junções e acho que posso ter mais certeza de que eles retornam os dados corretos sem o efeito de vários registros devido aos vários relacionamentos em todas as diferentes junções. Deixe-me dar um exemplo rápido:
Portanto, separando os diferentes blocos de informações que você deseja, você pode verificar cada parte individualmente (usando as opções comentadas, descomentando cada uma individualmente e executando apenas até a seleção selecionada) e se você precisou fazer uma alteração nas despesas cálculo (neste exemplo), é mais fácil encontrar do que quando todos eles são misturados em uma consulta massiva. Obviamente, as consultas de relatórios reais para as quais uso são geralmente muito mais complicadas do que o exemplo.
fonte
Como sempre, depende, mas há casos em que o desempenho é bastante aprimorado. Eu o vejo com instruções INSERT INTO SELECT, nas quais você usa um CTE para o select e depois o usa no INSERT INTO. Pode ter a ver com o RCSI estar ativado no banco de dados, mas nos momentos em que muito pouco é selecionado, pode ajudar bastante.
fonte