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