A partir desta postagem Como usar o ROW_NUMBER no procedimento a seguir?
Existem duas versões de respostas em que uma usa uma sub-query
e a outra usa umaCTE
para resolver o mesmo problema.
Agora, qual é a vantagem de usar CTE (Common Table Expression)
uma 'subconsulta' em excesso (portanto, mais legível que a consulta está realmente fazendo)
A única vantagem de usar um CTE
over sub-select
é que eu posso realmente nomear o sub-query
. Existem outras diferenças entre os dois quando um CTE é usado como um CTE simples (não recursivo)?
sql
sql-server
tsql
subquery
common-table-expression
dance2die
fonte
fonte
Respostas:
Nas versões CTE de subconsulta versus simples (não recursiva), elas são provavelmente muito semelhantes. Você precisaria usar o criador de perfil e o plano de execução real para identificar quaisquer diferenças, e isso seria específico da sua configuração (portanto, não podemos lhe dizer a resposta na íntegra).
Em geral ; Um CTE pode ser usado recursivamente; uma subconsulta não pode. Isso os torna especialmente adequados para estruturas de árvores.
fonte
A CTE can be used recursively; a sub-query cannot
. Um exemplo teria sido ótimo.A principal vantagem da Common Table Expression (quando não a é usada para consultas recursivas ) é o encapsulamento. Em vez de declarar a subconsulta em todos os lugares em que você deseja usá-la, você pode defini-la uma vez, mas possui várias referências. para isso.
No entanto, isso não significa que ele seja executado apenas uma vez (como nas iterações anteriores desta resposta , obrigado a todos os que comentaram). A consulta definitivamente tem o potencial de ser executada várias vezes se referenciada várias vezes; o otimizador de consulta finalmente decide como a CTE deve ser interpretada.
fonte
CTE
são mais úteis para recursão:retornará
@n
linhas (até101
). Útil para calendários, conjuntos de linhas simulados etc.Eles também são mais legíveis (na minha opinião).
Além disso, são
CTE
esubqueries
são idênticos.fonte
;WITH blabla AS ...)
WITH
,MERGE
e similaresUma diferença que não foi mencionada é que uma única CTE pode ser referenciada nas várias partes de uma união
fonte
A menos que esteja faltando alguma coisa, você pode nomear CTEs e subconsultas com a mesma facilidade.
Eu acho que a principal diferença é a legibilidade (acho o CTE mais legível porque define sua subconsulta antecipadamente e não no meio).
E se você precisar fazer alguma coisa com recursão, terá problemas para fazer isso com uma subconsulta;)
fonte
Um fato importante que ninguém mencionou é que (pelo menos no postgres), os CTEs são cercas de otimização:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
Ou seja, eles serão tratados como sua própria consulta atômica, em vez de dobrados em todo o plano de consulta. Eu não tenho o conhecimento necessário para dar uma explicação melhor, mas você deve verificar a semântica da versão do sql que está usando; para usuários avançados, a capacidade de criar uma cerca de otimização pode ajudar no desempenho se você for especialista no controle do planejador de consultas; em 99% dos casos, no entanto, você deve evitar dizer ao planejador de consultas o que fazer, porque o que você acha que será mais rápido provavelmente é pior do que o que ele pensa que será mais rápido. :-)
fonte
Adicionando às respostas de outras pessoas, se você tiver uma e a mesma subconsulta usada várias vezes, poderá substituir todas essas subconsultas por uma CTE. Isso permite que você reutilize seu código melhor.
fonte
Uma coisa que você precisa entender também é que, nas versões mais antigas do SQL Server (sim, muitas pessoas ainda precisam oferecer suporte aos bancos de dados do SQL Server 2000), os CTEs não são permitidos e a tabela derivada é a melhor solução.
fonte
DICA: (MAXRECURSION n)
Por exemplo, você pode tentar:
fonte