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'.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top