Выбор ответа Senior Подзапросы и CTE обновлено

Материализуются ли CTE в PostgreSQL

Вопрос

Как PostgreSQL 16 выполняет WITH x AS (SELECT ...), на который ссылаются один раз, без побочных эффектов?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Встраивает в основной запрос как обычный подзапрос. С PostgreSQL 12 такой CTE инлайнится: условия из внешнего запроса могут «протолкнуться» внутрь и использовать индексы.

Варианты ответа

  1. Материализует во временную таблицу: CTE это барьер оптимизации
  2. Встраивает в основной запрос как обычный подзапросправильный ответ
  3. Создаёт временное представление в схеме pg_temp на время сессии
  4. Кеширует результат CTE между запросами до изменения таблиц

Разбор

С PostgreSQL 12 такой CTE инлайнится: условия из внешнего запроса могут «протолкнуться» внутрь и использовать индексы. Всегда материализовались CTE до 12 версии, сейчас материализация происходит, если CTE используется несколько раз, рекурсивный или с побочными эффектами (INSERT/UPDATE), либо если явно указать AS MATERIALIZED. Временных представлений и кеша между запросами CTE не создаёт.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.