linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Планировщик и оптимизатор/query-rewrite

kb/planner ── Планировщик и оптимизатор ── intermediate

Переписывание: представления и RLS

Третья стадия - система правил. Она раскрывает представления (view - это сохранённый запрос, не данные) и добавляет условия RLS. Планировщик потом сплющивает подзапрос, поэтому view сам по себе не замедляет запрос.

view as markdownaka: rewrite, view-expansion, rule-system

Переписывание работает с деревом запроса между анализом и планированием (см. query-lifecycle).

Раскрытие представлений

View не хранит данные - это сохранённый SELECT. При обращении его определение подставляется как подзапрос:

sql
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, агрегаты, оконные функции. Иногда барьер спасает от плохого плана, иногда мешает. Его используют осознанно в обе стороны.

§ команды

bash
CREATE VIEW v AS SELECT ...;

Сохранить запрос как представление

bash
EXPLAIN SELECT ... FROM v WHERE ...;

Увидеть, что view растворился в один скан

§ см. также

  • query-lifecycleЖизнь запроса: пять стадийЗапрос проходит пять стадий: разбор, семантический анализ, переписывание, планирование, выполнение. Стадии 1-3 определяют «что» получить, стадия 4 - «как». Один текст даёт одно дерево запроса, но разные планы.
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
  • join-algorithmsАлгоритмы соединения: nested loop, hash, mergeNested loop хорош при малом внешнем входе и индексе внутри; hash join - для больших входов по равенству (нужен work_mem); merge join - когда входы уже отсортированы. Memoize кеширует поиски nested loop.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки