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