Die PostgreSQL-Dokumentation zu WITH zeigt das folgende Beispiel:
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;
Es stellt auch fest:
Eine nützliche Eigenschaft von WITH-Abfragen besteht darin, dass sie nur einmal pro Ausführung der übergeordneten Abfrage ausgewertet werden, selbst wenn sie von der übergeordneten Abfrage oder den Geschwister-WITH-Abfragen mehrmals referenziert werden.
Ich sehe, dass WITH
dies für andere Dinge verwendet werden kann, beispielsweise für die rekursive Auswertung. Gibt es im obigen Beispiel einen wichtigen Unterschied zwischen der Verwendung WITH
und der Erstellung temporärer Tabellen?
postgresql
Nathan Long
quelle
quelle
SELECT
inWITH
wird nur den Namen eingeben und erneut ausführen. Während mit temporären Tabelle würde es dauernDROP
undCREATE
. Wenn Sie dagegen eine Abfrage erstellen und statische Daten häufig wiederverwenden, ist das Erstellen einer temporären Tabelle mit Indizes definitiv vorteilhaft für CTE.TEMPORARY TABLE
mitON COMMIT DROP
innerhalb einer Abfrage verwenden, müssen Sie auch nur die Abfrage ändern und erneut ausführen , oder? postgresql.org/docs/9.6/static/sql-createtable.htmlAntworten:
Es gibt ein paar subtile Unterschiede, aber nichts drastisches:
ON COMMIT DROP
Dauer der Sitzung (oder, falls vorhanden , der Transaktion) vorhanden, wobei der UmfangWITH
immer streng auf die Abfrage beschränkt ist.WITH
Tabelle Ausdrücke;VACUUM
Arbeiten an den Systemkatalogen, dieWITH
dies nicht tun. Sie benötigt einen zusätzlichen Roundtrip zum Erstellen / Füllen und zusätzliche Arbeit in der Cache-Verwaltung des Servers, sodass sie etwas weniger effizient ist.Insgesamt sollten Sie
WITH
temporäre Tabellen bevorzugen , es sei denn, Sie wissen, dass Sie von der Erstellung eines Index profitieren.Die andere Option, eine Unterabfrage in der
FROM
Klausel, bietet jedoch ganz andere Vorteile. Es kann insbesondere inline sein und Qualifikanten können nach oben / unten gezogen werden. Ich habe darüber kürzlich in einem Blog-Artikel geschrieben .quelle