0Pricing
SQL Academy · Урок

Чтение 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;

Распространённые узлы плана

  • Последовательное сканирование — читает всю таблицу
  • Сканирование по индексу — использует индекс
  • Сканирование кучи по битовой карте — объединяет несколько индексов
  • Хеш-соединение / соединение слиянием / вложенный цикл — стратегии соединения
  • Сортировка, Агрегация, Ограничение, Материализация

Порядок чтения плана

  1. Запустите EXPLAIN ANALYZE для медленного запроса
  2. Найдите узел с наибольшим actual time
  3. Сравните оценочное число rows с фактическим числом actual rows
  4. Проверьте, используются ли индексы
  5. Повторяйте: добавьте индекс / перепишите запрос / выполните 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 — локальная установка не требуется.

Все уроки этого курса

  1. Чтение EXPLAIN и EXPLAIN ANALYZE
  2. Последовательное сканирование и сканирование по индексу
  3. Хеш-соединение, соединение слиянием и вложенный цикл
  4. Поиск и исправление медленных запросов
← Назад к SQL Academy