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-lifecycle

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

Жизнь запроса: пять стадий

Запрос проходит пять стадий: разбор, семантический анализ, переписывание, планирование, выполнение. Стадии 1-3 определяют «что» получить, стадия 4 - «как». Один текст даёт одно дерево запроса, но разные планы.

view as markdownaka: query-stages, parse-rewrite-plan-execute

Между текстом SQL и строками результата запрос проходит конвейер.

Пять стадий

  1. Разбор (parse) - текст по грамматике превращается в дерево разбора; ловятся синтаксические ошибки. Существование таблиц ещё не проверяется.
  2. Анализ (analyze) - имена связываются с каталогом, проверяются типы и права, раскрывается *. Результат - дерево запроса. Здесь рождается ошибка «column does not exist».
  3. Переписывание (rewrite) - система правил раскрывает представления и применяет RLS (см. query-rewrite).
  4. Планирование (plan) - выбор самого дешёвого способа выполнить; результат - дерево плана (см. cost-model).
  5. Выполнение (execute) - исполнитель идёт по дереву и выдаёт строки.

Что и как

Стадии 1-3 описывают, что нужно получить, стадия 4 - как. Один текст всегда даёт одно дерево запроса, но план зависит от данных и статистики и может меняться. Поэтому «вдруг стало медленно» почти всегда значит «сменился план», а не «изменился запрос».

Простой и расширенный протокол

Простой протокол выполняет всё за раз. Расширенный (Parse / Bind / Execute) разделяет стадии: разобрать один раз, выполнять много с разными параметрами. Это открывает дорогу кешу плана (см. join-order-geqo).

sql
EXPLAIN SELECT * FROM flights WHERE departure = 'SVO';

§ команды

bash
EXPLAIN SELECT ...;

Показать дерево плана без выполнения

bash
EXPLAIN ANALYZE SELECT ...;

Выполнить и показать факт рядом с оценкой

§ см. также

  • query-rewriteПереписывание: представления и RLSТретья стадия - система правил. Она раскрывает представления (view - это сохранённый запрос, не данные) и добавляет условия RLS. Планировщик потом сплющивает подзапрос, поэтому view сам по себе не замедляет запрос.
  • cost-modelСтоимостная модельСтоимость - условные единицы, где последовательное чтение страницы = 1.0. Seq Scan стоит relpages × seq_page_cost + reltuples × cpu_tuple_cost. Планировщик выбирает план с минимальной оценкой, а не «правильный».
  • join-order-geqoПорядок соединений, GEQO и кеш планаЧисло порядков соединения растёт быстрее факториала; до geqo_threshold (12) планировщик ищет порядок динамическим программированием, дальше - генетическим GEQO. Кеш плана: после ~5 вызовов custom может стать generic.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки