martes, 10 de noviembre de 2015

With Clause :: New Feature :: 12c

:: With Clause :: New Feature :: 12c

Algunos amigos no conocen mucho la clausula with, la cual es conocida como la clausula "subquery factoring clause".

En resumen y para no irme en mucha charla técnica, la clausula pre-materializa los resultados de los querys(los subquerys son prematerializados) antes de que los mismos sean ejecutados.

Veamos este tema con números mejor.

Utilizando el schema de ejemplo HR ejecutamos y analizamos el siguiente query:

SELECT a.first_name, b.DEPARTMENT_NAME
  FROM hr.employees a, hr.departments b
 WHERE     a.department_id = b.department_id

       AND b.department_id < (SELECT AVG (department_id) FROM hr.departments);

El plan de ejecución es el siguiente:


Ahora utilizando la clausula With:

WITH TEMP_TABLE
     AS (SELECT AVG (department_id) DEPT_RESULT FROM hr.departments)
SELECT a.first_name, b.DEPARTMENT_NAME
  FROM hr.employees a, hr.departments b, TEMP_TABLE C
 WHERE a.department_id = b.department_id AND b.department_id < C.DEPT_RESULT

El plan de ejecución es el siguiente:



El costo en bytes pasa de 338 a 195, y aunque para este ejemplo pareciera poco. En un ambiente con millones de registros, operaciones, etc, etc la ganancia seria muy representativa y va a implicar una enorme mejoría en performance.

Saludos cordiales,

Miguel Vega