Чтение EXPLAIN и EXPLAIN ANALYZE
Читайте дерево плана, сопоставляйте стоимость с фактическим временем и находите самые ресурсоёмкие узлы
«Чтение EXPLAIN и EXPLAIN ANALYZE» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужен EXPLAIN?
EXPLAIN показывает стратегию планировщика для выполнения запроса, не запуская его. EXPLAIN ANALYZE запускает запрос и показывает фактическое время выполнения.
Базовый EXPLAIN
Показать расчётный план:
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- QUERY PLAN
-- ---------------------------------------------------------------
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- Index Cond: (user_id = 42)EXPLAIN ANALYZE
Запускает запрос и добавляет фактическое время выполнения и количество строк:
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
-- Index Scan using orders_user_id_idx on orders
-- (cost=0.43..8.45 rows=5 width=120)
-- (actual time=0.041..0.043 rows=4 loops=1)
-- Planning Time: 0.082 ms
-- Execution Time: 0.057 msЧтение дерева
Планы представляют собой деревья. Отступ показывает дочерний узел. Дочерние узлы выполняются раньше родительских.
Aggregate
-> Hash Join
Hash Cond: (o.user_id = u.id)
-> Seq Scan on orders
-> Hash
-> Seq Scan on usersСтоимость и время
Столбец cost содержит TWO числа: startup_cost..total_cost. Это условные единицы планировщика, а не секунды. Для фактических значений используйте actual time.
rows — расчётное значение, actual rows — фактическое
rows — оценка планировщика. actual rows — фактический результат. Если значения сильно различаются, статистика неточна.
Циклы умножают время
Для вложенных циклов actual time=X loops=N означает, что каждая итерация заняла X; суммарное время для узла — X×N.
Nested Loop (actual time=0.05..2.03 rows=500)
-> Seq Scan on orders (actual ... loops=1)
-> Index Scan using users_pkey (actual time=0.01..0.01 loops=500)BUFFERS показывает операции ввода-вывода
EXPLAIN (ANALYZE, BUFFERS) сообщает о попаданиях в буфер и чтениях — об операциях ввода-вывода, стоящих за измеренным временем:
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- Buffers: shared hit=12 read=4Параметры FORMAT
Для программной обработки используйте JSON или YAML:
EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;Не используйте EXPLAIN ANALYZE для изменяющих данные операторов!
EXPLAIN ANALYZE для UPDATE/DELETE/INSERT действительно выполняет оператор. Оберните его в транзакцию с ROLLBACK, если хотите проверить запрос, не фиксируя изменения:
BEGIN;
EXPLAIN ANALYZE DELETE FROM orders WHERE ...;
ROLLBACK;Распространённые узлы плана
- Последовательное сканирование — читает всю таблицу
- Сканирование по индексу — использует индекс
- Сканирование кучи по битовой карте — объединяет несколько индексов
- Хеш-соединение / соединение слиянием / вложенный цикл — стратегии соединения
- Сортировка, Агрегация, Ограничение, Материализация
Порядок чтения плана
- Запустите EXPLAIN ANALYZE для медленного запроса
- Найдите узел с наибольшим
actual time - Сравните оценочное число
rowsс фактическим числомactual rows - Проверьте, используются ли индексы
- Повторяйте: добавьте индекс / перепишите запрос / выполните ANALYZE
Итоги
EXPLAIN ANALYZE — ваш основной инструмент для анализа производительности.
- Стоимость относительна, время реально
- Разница между оценочным и фактическим числом строк указывает на проблемы со статистикой
- BUFFERS показывает операции ввода-вывода
- Оберните изменяющие данные запросы в BEGIN; ... ROLLBACK
Быстрая проверка
В чём разница между EXPLAIN и EXPLAIN ANALYZE?
Часто задаваемые вопросы
Урок «Чтение EXPLAIN и EXPLAIN ANALYZE» бесплатный?
Да — полный текст урока «Чтение EXPLAIN и EXPLAIN ANALYZE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Чтение EXPLAIN и EXPLAIN ANALYZE»?
Читайте дерево плана, сопоставляйте стоимость с фактическим временем и находите самые ресурсоёмкие узлы Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Чтение EXPLAIN и EXPLAIN ANALYZE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение EXPLAIN и EXPLAIN ANALYZE
- Последовательное сканирование и сканирование по индексу
- Хеш-соединение, соединение слиянием и вложенный цикл
- Поиск и исправление медленных запросов