Ответ
Это ключевые команды для анализа и оптимизации производительности запросов в 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
на продуктивной базе. Показывает реальную картину и помогает найти узкие места, где оценка планировщика сильно разошлась с реальностью.