Что делает команда `EXPLAIN ANALYZE` в PostgreSQL и чем она отличается от `EXPLAIN`?

Ответ

Это ключевые команды для анализа и оптимизации производительности запросов в PostgreSQL.

EXPLAIN

Команда EXPLAIN не выполняет сам запрос. Она обращается к планировщику PostgreSQL и показывает предполагаемый (гипотетический) план выполнения запроса. Этот план строится на основе статистики о таблицах, которую собрал ANALYZE (или автовакуум).

Что показывает:

  • Последовательность операций (Scan, Join, Sort, Aggregate).
  • Оценочную стоимость (cost) начала выполнения и общую стоимость.
  • Оценочное количество строк (rows), которое вернёт каждая операция.

EXPLAIN ANALYZE

Эта команда делает всё то же, что и EXPLAIN, но с одним важным отличием: она реально выполняет запрос. Поэтому её вывод содержит не только предполагаемый план, но и фактические метрики выполнения.

Что добавляется к выводу EXPLAIN:

  • actual time: Реальное время в миллисекундах, затраченное на выполнение операции (от старта первой строки до получения последней).
  • rows: Фактическое количество строк, возвращённое операцией.
  • loops: Сколько раз выполнялся данный узел плана.
  • Buffers: Информация об использовании буферного кэша (shared-памяти). hit означает, что блок данных был найден в кэше, read — что он был прочитан с диска.

Пример вывода:

-- План с реальными метриками
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;

-- Результат
Index Scan using users_pkey on users (cost=0.29..8.31 rows=1 width=118) 
  (actual time=0.025..0.026 rows=1 loops=1)
  Index Cond: (id = 1)
  Buffers: shared hit=4

Ключевое отличие:

  • EXPLAIN — быстро и безопасно, показывает намерения планировщика. Используется для быстрой оценки плана.
  • EXPLAIN ANALYZE — медленнее (т.к. выполняет запрос) и может быть опасно для UPDATE/DELETE/INSERT на продуктивной базе. Показывает реальную картину и помогает найти узкие места, где оценка планировщика сильно разошлась с реальностью.