Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Diferença entre cláusula WITH e subconsulta?


O WITH cláusula é para fatoração de subconsulta, também conhecida como expressões de tabela comuns ou CTEs:

A cláusula WITH query_name permite atribuir um nome a um bloco de subconsulta. Você pode fazer referência ao bloco de subconsulta em vários lugares na consulta especificando query_name. O Oracle Database otimiza a consulta tratando o nome da consulta como uma exibição em linha ou como uma tabela temporária.

Em seu segundo exemplo, o que você chamou de temp_table é uma exibição em linha, não uma tabela temporária.

Em muitos casos, a escolha de qual usar se resume ao seu estilo preferido, e os CTEs podem tornar o código mais legível, especialmente com vários níveis de subconsultas (as opiniões variam, é claro). Se você consultar a visualização CTE/inline apenas uma vez, provavelmente não verá nenhuma diferença no desempenho, e o otimizador pode acabar com o mesmo plano.

Eles são particularmente úteis quando você precisa usar a mesma subconsulta em mais de um local, como em uma união. Você pode extrair uma visualização em linha em um CTE para que o código não seja repetido e isso permite que o otimizador o materialize se achar que isso seria benéfico.

Por exemplo, este exemplo inventado:
select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

poderia ser refatorado para:
with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

A subconsulta não precisa mais ser repetida. Quanto mais complicado for o código repetido, mais benéfico será, do ponto de vista da manutenção, usar um CTE. E quanto mais cara for a subconsulta, mais benefícios de desempenho você poderia ver usando um CTE, embora o otimizador geralmente seja muito bom em descobrir o que você está fazendo de qualquer maneira.