Переписывание работает с деревом запроса между анализом и планированием (см. query-lifecycle).
Раскрытие представлений
View не хранит данные - это сохранённый SELECT. При обращении его
определение подставляется как подзапрос:
CREATE VIEW svo AS SELECT * FROM flights WHERE departure = 'SVO';
SELECT flight_no FROM svo WHERE arrival = 'LED';
-- → SELECT flight_no FROM (SELECT * FROM flights WHERE departure='SVO') v
-- WHERE v.arrival = 'LED';
Планировщик дальше сплющивает подзапрос в один уровень и применяет оба условия к одному скану. Поэтому обращение через view и эквивалентный прямой запрос обычно дают одинаковый план - view не делает медленнее.
Row-level security
Если на таблице есть RLS-политики, переписывание добавляет к запросу условия, ограничивающие видимые строки, - автоматически и незаметно для текста запроса.
Когда сплющивания не происходит
Некоторые конструкции - оптимизационные барьеры - запрещают сплющивать
подзапрос: OFFSET 0, WITH ... AS MATERIALIZED, агрегаты, оконные
функции. Иногда барьер спасает от плохого плана, иногда мешает. Его
используют осознанно в обе стороны.