¿Expresiones de tabla comunes de PostgreSQL frente a una tabla temporal?


11

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 WITHse puede usar para otras cosas, como la evaluación recursiva. Pero en el ejemplo anterior, ¿hay alguna diferencia importante entre usar WITHy crear tablas temporales?


cuando se utiliza CTE para la construcción de la consulta, la adición de otra columna que SELECTen WITHapenas está escribiendo el nombre y volver a ejecutar. Mientras que con la tabla temporal tomaría DROPy CREATE. 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.
Vao Tsun el

@VaoTsun si se usa TEMPORARY TABLEcon ON COMMIT DROPuna consulta, también es solo cuestión de modificar la consulta y volver a ejecutarla, ¿verdad? postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

Respuestas:


15

Hay algunas diferencias sutiles, pero nada drástico:

  • Puede agregar índices en una tabla temporal;
  • Las tablas temporales existen durante la vida útil de la sesión (o, si es una ON COMMIT DROPtransacción), WITHsiempre que se limite estrictamente a la consulta;
  • Si una consulta invoca una función / procedimiento, se puede ver la tabla temporal, pero puede no ver ninguna WITHde mesa expresiones;
  • Una tabla temporal genera VACUUMtrabajo en los catálogos del sistema que WITHno 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 WITHtablas temporales a menos que sepa que se beneficiará al crear un índice.

Sin embargo, la otra opción, una subconsulta en la FROMclá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 .


¿Qué pasa con las vistas y las vistas temporales?
CMCDragonkai

1
Un poco intermedio pero más cerca de una tabla temporal que un término CTE. Sin índices Alcance de la sesión. Visible para funciones / procedimientos. Necesita catálogo de vacío.
Craig Ringer el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.