sql >> Base de Datos >  >> RDS >> Oracle

¿Diferencia entre la cláusula CON y la subconsulta?

El WITH La cláusula es para la factorización de subconsultas, también conocidas como expresiones de tabla comunes o CTE:

La cláusula WITH query_name le permite asignar un nombre a un bloque de subconsulta. A continuación, puede hacer referencia al bloque de subconsulta en varios lugares de la consulta especificando query_name. Oracle Database optimiza la consulta al tratar el nombre de la consulta como una vista en línea o como una tabla temporal.

En su segundo ejemplo, lo que ha llamado temp_table es una vista en línea, no una tabla temporal.

En muchos casos, la elección de cuál usar se reduce a su estilo preferido, y las CTE pueden hacer que el código sea más legible, particularmente con múltiples niveles de subconsultas (las opiniones varían, por supuesto). Si solo consulta la vista CTE/en línea una vez, probablemente no verá ninguna diferencia en el rendimiento y el optimizador puede terminar con el mismo plan.

Sin embargo, son particularmente útiles cuando necesita usar la misma subconsulta en más de un lugar, como en una unión. Puede extraer una vista en línea en un CTE para que el código no se repita y permita que el optimizador lo materialice si cree que sería beneficioso.

Por ejemplo, este ejemplo artificial:

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

podría refactorizarse a:

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

La subconsulta ya no tiene que repetirse. Cuanto más complicado es el código repetido, más beneficioso es desde el punto de vista del mantenimiento utilizar un CTE. Y cuanto más costosa sea la subconsulta, mayor beneficio de rendimiento podría ver usando un CTE, aunque el optimizador suele ser bastante bueno para averiguar lo que estás haciendo de todos modos.