В чем разница между EXPLAIN и EXPLAIN ANALYZE
Что проверяют
Знаете ли вы, что первое показывает план, а второе выполняет запрос, и понимаете ли риск последнего.
Как отвечать
EXPLAIN показывает план, который выбрал планировщик, с оценками: сколько строк он ожидает и во что оценивает стоимость. Запрос при этом не выполняется.
EXPLAIN ANALYZE действительно выполняет запрос и рядом с оценками показывает фактические значения: реальное время каждого узла и реальное число строк.
Практическая ценность именно в сравнении оценки и факта. Планировщик ждал сто строк, а пришло сто тысяч, значит статистика устарела и нужен ANALYZE, или условие такое, что оценить его он не умеет. Из-за неверной оценки выбирается неудачный способ соединения, и отсюда растёт большинство медленных запросов.
Полезные дополнения: BUFFERS показывает, сколько страниц прочитано из кэша и с диска; FORMAT JSON удобен для инструментов визуализации; SETTINGS печатает изменённые параметры планировщика.
Главное предупреждение: EXPLAIN ANALYZE выполняет запрос по-настоящему, включая UPDATE, DELETE и INSERT. Чтобы посмотреть план изменяющего запроса и не изменить данные, его оборачивают в транзакцию с откатом:
BEGIN;
EXPLAIN ANALYZE UPDATE jobs SET is_active = false WHERE id = 1;
ROLLBACK;Где спотыкаются
Не знают, что ANALYZE выполняет запрос, и запускают его на изменяющей команде в проде.
Смотрят только на итоговое время, не сравнивая оценку с фактом.
Путают EXPLAIN ANALYZE с командой ANALYZE, которая обновляет статистику.
Делают выводы по плану на тестовой базе с сотней строк.