Para CTE ou não para CTE
-
26-09-2019 - |
Pergunta
Tendo ficado preso ao SQL2000 por muito tempo, eu realmente não tive muita exposição a expressões de tabela comuns.
As respostas que dei Aqui (#4025380) e Aqui (#4018793) foram contra o fluxo, pois eles não usaram um CTE.
Aprecio que, para a recursão, eles são o joelho de Beez, e há algumas consultas que podem ser bastante simplificadas pelo uso deles, mas em que ponto o uso deles é apenas frívolo? Eles têm um ótimo benefício de desempenho em uma subconsulta ou uma junção? Eles realmente simplificam o código e o tornam mais sustentável?
Em suma, quando é uma boa prática usar um CTE sobre uma sintaxe 'menor'.
Solução
Geralmente você deve usar um CTE em uma subconeração normal se:
- Sua consulta requer recursão (como você observou)
- A subconsência é grande ou complexa
- A consulta contendo é grande ou complexa
- A subconsência é repetida (ou pelo menos várias subconsações podem ser simplificadas executando diferentes operações simples em uma subconsulta comum)
Em suma, sim, eles tornam as consultas mais legíveis quando bem usadas.
Outras dicas
Pessoalmente, depois de me sentir confortável em usá -los, acho que eles produzem código mais limpo e legível. Como exemplo, compare sua resposta para a minha em #4018793. Nós essencialmente fizemos a mesma coisa; Eu usei um CTE e você não.
Sua resposta sem CTE:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
Minha resposta com CTE:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
Eles são açúcar sintático, com exceção das consultas hierárquicas/recursivas.
No entanto, nem tudo o que pode ser feito recursivamente deve ser - a geração de datas por meio do CTE recursivo foi quase melhor que um cursor - o truque da tabela de números escalou muito melhor.
A CTE produz um resultado mais rápido em um cenário recursivo. O resultado do CTE é usado repetidamente para obter o conjunto de resultados finais. Então, como você pegou a sua cláusula ou subconstração no CTE, definitivamente mostrará a melhoria do desempenho.
Referência: http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx
Apenas uma nota, em muitos cenários, as mesas temp oferecem melhor desempenho do que o CTE também, então você deve tentar as mesas de temperatura também.
Referência: http://social.msdn.microsoft.com/forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb