Материализуются ли CTE в PostgreSQL
Вопрос
Как PostgreSQL 16 выполняет WITH x AS (SELECT ...), на который ссылаются один раз, без побочных эффектов?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Материализует во временную таблицу: CTE это барьер оптимизации
- Встраивает в основной запрос как обычный подзапросправильный ответ
- Создаёт временное представление в схеме pg_temp на время сессии
- Кеширует результат CTE между запросами до изменения таблиц
Разбор
С PostgreSQL 12 такой CTE инлайнится: условия из внешнего запроса могут «протолкнуться» внутрь и использовать индексы. Всегда материализовались CTE до 12 версии, сейчас материализация происходит, если CTE используется несколько раз, рекурсивный или с побочными эффектами (INSERT/UPDATE), либо если явно указать AS MATERIALIZED. Временных представлений и кеша между запросами CTE не создаёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что такое коррелированный подзапрос
Следующий вопрос
Что писать в SELECT внутри EXISTS
Термины по теме
Ещё по теме «Подзапросы и CTE»
- Полный путь категории в дереве
- Клиенты, у которых все заказы оплачены
- Дни без продаж по регионам
- Цепочка руководителей вверх по дереву
- Дороже любой книги: ALL против MAX
- Категория с максимальной выручкой
- Два последних заказа каждого клиента через LATERAL
- Дороже среднего по своей категории