La documentation PostgreSQL sur WITH montre l'exemple suivant:
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;
Il note également:
Une propriété utile des requêtes WITH est qu'elles ne sont évaluées qu'une seule fois par exécution de la requête parent, même si elles sont référencées plusieurs fois par la requête parent ou les requêtes WITH avec frère.
Je vois que cela WITH
peut être utilisé pour d'autres choses, comme une évaluation récursive. Mais dans l'exemple ci-dessus, y a-t-il une différence importante entre l'utilisation WITH
et la création de tables temporaires?
postgresql
Nathan Long
la source
la source
SELECT
in neWITH
fait que taper le nom et la relancer. Alors qu'avec une table temporaire, il faudraitDROP
etCREATE
. D'un autre côté, si vous construisez une requête et que vous allez réutiliser des données statiques de nombreuses fois - la construction d'une table temporaire avec des index est certainement bénéfique contre CTE.TEMPORARY TABLE
avecON COMMIT DROP
dans une requête, il suffit également de modifier la requête et de la relancer, non? postgresql.org/docs/9.6/static/sql-createtable.htmlRéponses:
Il y a quelques différences subtiles, mais rien de radical:
ON COMMIT DROP
, transaction), alors que la portéeWITH
est toujours strictement limitée à la requête;WITH
expression de table;VACUUM
travail sur les catalogues système quiWITH
ne le fait pas, elle a besoin d'un aller-retour supplémentaire pour le créer / remplir, et elle nécessite un travail supplémentaire dans la gestion du cache du serveur, donc elle est légèrement moins efficace.Dans l'ensemble, vous devriez préférer les
WITH
tables temporaires, sauf si vous savez que vous bénéficierez de la création d'un index.Cependant, l'autre option, une sous-requête de la
FROM
clause, présente un ensemble d'avantages très différent. Il peut être en ligne, en particulier, et les qualificatifs peuvent être tirés vers le haut / bas. J'ai écrit à ce sujet dans un récent article de blog .la source