Документация PostgreSQL по WITH показывает следующий пример:
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;
Он также отмечает:
Полезным свойством запросов WITH является то, что они оцениваются только один раз за выполнение родительского запроса, даже если на них ссылается более одного раза родительский запрос или один и тот же запрос WITH.
Я вижу, что это WITH
может быть использовано для других целей, таких как рекурсивная оценка. Но в приведенном выше примере, есть ли важное различие между использованием WITH
и созданием временных таблиц?
postgresql
Натан Лонг
источник
источник
SELECT
inWITH
просто вводит имя и перезапускается. Хотя с временной таблицей это заняло быDROP
иCREATE
. С другой стороны, если вы строите запрос и собираетесь многократно использовать статические данные - создание временной таблицы с индексами определенно выгодно для CTE.TEMPORARY TABLE
сON COMMIT DROP
внутри запроса, это также вопрос модификации запроса и повторного запуска, верно? postgresql.org/docs/9.6/static/sql-createtable.htmlОтветы:
Есть несколько тонких различий, но ничего радикального:
ON COMMIT DROP
транзакция), когдаWITH
область всегда строго ограничена запросом;WITH
таблиц-выражений;VACUUM
работу с системными каталогами, котораяWITH
этого не делает, для ее создания / заполнения требуется дополнительная обратная передача, а также требуется дополнительная работа по управлению кэшем сервера, поэтому она немного менее эффективна.В целом, вы должны предпочесть
WITH
временные таблицы, если вы не уверены, что получите пользу от создания индекса.Однако другой вариант, подзапрос в
FROM
предложении, имеет совсем другой набор преимуществ. В частности, он может быть встроенным, а квалификаторы могут быть перемещены вверх / вниз. Я написал об этом в недавней статье в блоге .источник