Временная таблица (материализация) с WITH
Создаёт ли with временную таблицу? Если да, то создаёт ли вложенный select временную таблицу?
Насколько я вижу из доки, да. Но вопрос тогда, в чём существенная разница между with и select? Я думал, что это alias.
Ответы (2 шт):
Не совсем так
Табличные выражения можно назвать анаголом временных таблиц, актуальных только в рамках одного запроса. В табличных выражениях может быть как SELECT, так и модификация данных - INSERT, UPDATE или DELETE. ... Каждое табличное выражение имеет имя и может определять имена возвращаемых полей.
Разница в том что вы подготавливаете выражение для дальнейшего использования в основном запросе. Временные таблицы можно использовать в нескольких запросах в рамках транзакции. А табличное выражение только в рамках одного запроса.
Ответ на ваш вопрос зависит от вашего ответа на вопрос «А какой версии у вас PostgreSQL?» :-) . Ваша ссылка — про древнючий 9.5. Начиная с версии 12, материализация общих табличных выражений происходит «по-умному»:
However, if a
WITHquery is non-recursive and side-effect-free (that is, it is aSELECTcontaining no volatile functions) then it can be folded into the parent query, allowing joint optimization of the two query levels. By default, this happens if the parent query references theWITHquery just once, but not if it references theWITHquery more than once. You can override that decision by specifyingMATERIALIZEDto force separate calculation of theWITHquery, or by specifyingNOT MATERIALIZEDto force it to be merged into the parent query. The latter choice risks duplicate computation of the WITH query, but it can still give a net savings if each usage of the WITH query needs only a small part of the WITH query's full output.
(Выделение добавлено.) Так что они более-менее равны подзапросу, по крайней мере во многих случаях.