В чем ключевые различия между `EXPLAIN` и `EXPLAIN ANALYZE` в PostgreSQL?

Ответ

Обе команды используются для анализа и оптимизации SQL-запросов, но работают принципиально по-разному.

EXPLAIN

  • Что делает: Показывает предполагаемый план выполнения запроса, который строит планировщик СУБД.
  • Не выполняет запрос: Команда не обращается к данным, а лишь моделирует, как бы она это сделала. Это делает её мгновенной и безопасной для любой среды.
  • Что показывает: Типы сканирования (Seq Scan, Index Scan), методы соединения таблиц (Nested Loop, Hash Join), предполагаемую стоимость и количество строк.
  • Когда использовать: Для быстрой проверки, используются ли индексы, и для общего понимания логики выполнения запроса.

EXPLAIN ANALYZE

  • Что делает: Реально выполняет запрос и показывает план, дополненный фактическими данными о выполнении.
  • Выполняет запрос: Это может быть медленно и ресурсозатратно. Для запросов, изменяющих данные (INSERT, UPDATE, DELETE), изменения будут применены, если не обернуть команду в транзакцию с ROLLBACK.
  • Что показывает: Всё то же, что и EXPLAIN, плюс:
    • Реальное время выполнения каждого узла плана (в миллисекундах).
    • Фактическое количество строк, прошедших через каждый узел.
  • Когда использовать: Для точной диагностики производительности, когда предполагаемый план сильно расходится с реальностью. Идеально для поиска "узких мест" в запросе.

Пример:

-- Показывает только теоретический план
EXPLAIN SELECT * FROM users WHERE id = 1;

-- Выполняет запрос и показывает план с реальными метриками
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;

Итог: EXPLAIN — это теория (как должно быть), EXPLAIN ANALYZE — это практика (как было на самом деле). Начинайте с EXPLAIN, и если его вывода недостаточно для оптимизации, используйте EXPLAIN ANALYZE с осторожностью.