#query-lifecycle
Какие стадии проходит запрос от текста до результата?
Что отвечать
Четыре стадии. Разбор (parse): текст превращается в дерево, проверяются синтаксис и имена объектов по системному каталогу. Переписывание (rewrite): применяются правила и представления - например, обращение к view разворачивается в подзапрос, накладывается защита строк (RLS). Планирование (plan): стоимостный оптимизатор перебирает способы доступа и порядки соединений и выбирает самый дешёвый план. Исполнение (execute): дерево узлов плана гоняется по модели «тяни строку сверху» (volcano), каждый узел запрашивает строки у дочерних по одной. Разделение на стадии объясняет, почему prepared statement может планироваться один раз, а исполняться много.
Что хотят услышать
Senior должен: - назвать четыре стадии по порядку и что делает каждая - привести пример переписывания: разворот view в подзапрос, RLS - объяснить, что планирование отделено от исполнения, и связать это с кешем плана у prepared statement - понимать, что оптимизатор стоимостной: он сравнивает оценки, а не выполняет варианты
Подводные камни
- ✗ Считать, что view это «сохранённый результат» - на самом деле он разворачивается в текст запроса на стадии переписывания
- ✗ Путать планирование и исполнение - planning time и execution time это разные числа в EXPLAIN
- ✗ Думать, что оптимизатор пробует планы вживую - он оценивает их стоимость по формулам
Follow-up
- ? Что происходит со `SELECT` из view на стадии переписывания?
- ? Почему planning time и execution time разделены в выводе EXPLAIN?
- ? Как стадии связаны с кешем плана prepared statement?
Глубина в базе знаний