# Жизнь запроса: пять стадий _Планировщик и оптимизатор · PostgreSQL Knowledge Base_ **TL;DR:** Запрос проходит пять стадий: разбор, семантический анализ, переписывание, планирование, выполнение. Стадии 1-3 определяют «что» получить, стадия 4 - «как». Один текст даёт одно дерево запроса, но разные планы. Между текстом SQL и строками результата запрос проходит конвейер. ## Пять стадий 1. **Разбор (parse)** - текст по грамматике превращается в дерево разбора; ловятся синтаксические ошибки. Существование таблиц ещё не проверяется. 2. **Анализ (analyze)** - имена связываются с каталогом, проверяются типы и права, раскрывается `*`. Результат - дерево запроса. Здесь рождается ошибка «column does not exist». 3. **Переписывание (rewrite)** - система правил раскрывает представления и применяет RLS (см. [query-rewrite](/courses/postgres/kb/query-rewrite.md)). 4. **Планирование (plan)** - выбор самого дешёвого способа выполнить; результат - дерево плана (см. [cost-model](/courses/postgres/kb/cost-model.md)). 5. **Выполнение (execute)** - исполнитель идёт по дереву и выдаёт строки. ## Что и как Стадии 1-3 описывают, *что* нужно получить, стадия 4 - *как*. Один текст всегда даёт одно дерево запроса, но план зависит от данных и статистики и может меняться. Поэтому «вдруг стало медленно» почти всегда значит «сменился план», а не «изменился запрос». ## Простой и расширенный протокол Простой протокол выполняет всё за раз. Расширенный (Parse / Bind / Execute) разделяет стадии: разобрать один раз, выполнять много с разными параметрами. Это открывает дорогу кешу плана (см. [join-order-geqo](/courses/postgres/kb/join-order-geqo.md)). ```sql EXPLAIN SELECT * FROM flights WHERE departure = 'SVO'; ``` ## Команды ```sql EXPLAIN SELECT ...; ``` Показать дерево плана без выполнения ```sql EXPLAIN ANALYZE SELECT ...; ``` Выполнить и показать факт рядом с оценкой ## См. также - [Переписывание: представления и RLS](/courses/postgres/kb/query-rewrite.md) - [Стоимостная модель](/courses/postgres/kb/cost-model.md) - [Порядок соединений, GEQO и кеш плана](/courses/postgres/kb/join-order-geqo.md)