La documentación de PostgreSQL en WITH muestra el siguiente ejemplo:
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
También señala:
Una propiedad útil de las consultas WITH es que se evalúan solo una vez por ejecución de la consulta principal, incluso si la consulta principal o las consultas de hermanos se refieren a ellas más de una vez.
Veo que WITH
se puede usar para otras cosas, como la evaluación recursiva. Pero en el ejemplo anterior, ¿hay alguna diferencia importante entre usar WITH
y crear tablas temporales?
postgresql
Nathan Long
fuente
fuente
SELECT
enWITH
apenas está escribiendo el nombre y volver a ejecutar. Mientras que con la tabla temporal tomaríaDROP
yCREATE
. Por otro lado, si crea una consulta y va a reutilizar datos estáticos muchas veces, crear una tabla temporal con índices es definitivamente beneficioso contra CTE.TEMPORARY TABLE
conON COMMIT DROP
una consulta, también es solo cuestión de modificar la consulta y volver a ejecutarla, ¿verdad? postgresql.org/docs/9.6/static/sql-createtable.htmlRespuestas:
Hay algunas diferencias sutiles, pero nada drástico:
ON COMMIT DROP
transacción),WITH
siempre que se limite estrictamente a la consulta;WITH
de mesa expresiones;VACUUM
trabajo en los catálogos del sistema queWITH
no lo hace, necesita un viaje de ida y vuelta adicional para crearlo / llenarlo, y requiere un trabajo adicional en la administración de la memoria caché del servidor, por lo que es un poco menos eficiente.En general, debe preferir las
WITH
tablas temporales a menos que sepa que se beneficiará al crear un índice.Sin embargo, la otra opción, una subconsulta en la
FROM
cláusula, tiene un conjunto muy diferente de ventajas. Puede estar en línea, en particular, y los calificadores se pueden subir / bajar. Escribí sobre esto en un artículo de blog reciente .fuente