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

Ответ

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

EXPLAIN

Показывает предполагаемый (estimated) план выполнения, который строит оптимизатор базы данных. Запрос при этом не выполняется.

  • Что делает: Анализирует запрос, статистику таблиц и индексы, чтобы предсказать, как он будет выполняться.
  • Преимущества: Быстро и безопасно. Идеально для быстрой проверки использования индексов.
-- Показывает только план, без выполнения
EXPLAIN SELECT * FROM users WHERE registration_date > '2023-01-01';

EXPLAIN ANALYZE

Сначала строит план, а затем реально выполняет запрос и показывает фактический план с реальными метриками времени и количества строк.

  • Что делает: Выполняет запрос и сравнивает оценки планировщика с реальными результатами.
  • Преимущества: Предоставляет точную информацию о производительности, включая реальное время выполнения каждого шага (actual time). Помогает выявить неверные оценки планировщика.
-- Выполняет запрос и показывает план с реальными метриками
EXPLAIN ANALYZE SELECT * FROM users WHERE registration_date > '2023-01-01';

Ключевое различие

  • EXPLAIN — это гипотеза о том, как будет выполнен запрос.
  • EXPLAIN ANALYZE — это эксперимент, который выполняет запрос и показывает, как он был выполнен на самом деле.

Важно: Используйте EXPLAIN ANALYZE с осторожностью для UPDATE, DELETE, INSERT, так как команда реально выполнит изменение данных. Для таких запросов её лучше оборачивать в транзакцию с последующим ROLLBACK.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь ты такой, пишешь запрос, а он тормозит, как черепаха в патруле. И тут встаёт вопрос: а что, сука, там у него в голове, у этой базы данных? Как она собирается мою красоту исполнять? Так вот, слушай сюда, есть два подхода, и они, блядь, как небо и земля.

EXPLAIN — это как спросить у прораба: «Ну чё, как будем строить?» Он тебе, этот оптимизатор, достаёт свои чертежи, смотрит на статистику (которая может быть хуёвой, кстати), и начинает теоретизировать. «Вот тут, — говорит, — индекс подцепим, тут сджойним, тут отфильтруем». Запрос при этом НЕ ВЫПОЛНЯЕТСЯ, НИ ХУЯ! Это просто план-намерение, гипотеза, ёпта. Быстро, безопасно, но может оказаться полной хуйнёй, если статистика устарела.

EXPLAIN SELECT * FROM users WHERE registration_date > '2023-01-01';

Выдаст тебе сухую теорию. «О, я планирую вот так вот, индекс idx_reg_date использовать, отсею примерно 10к строк». А на деле там овердохуища строк, и индекс кривой.

EXPLAIN ANALYZE — это как сказать прорабу: «А теперь построй нахуй, а я с секундомером постою». Вот это, блядь, уже серьёзно. Команда сначала план построит, а потом РЕАЛЬНО ВЫПОЛНИТ ТВОЙ ЗАПРОС, СУКА! И после этого выдаст отчёт: «Так, я планировал 10к строк, а на самом деле их было 1.5 миллиона, и этот шаг занял не 0.1 мс, а ебаные 15 секунд, я обосрался».

EXPLAIN ANALYZE SELECT * FROM users WHERE registration_date > '2023-01-01';

Вот тут ты увидишь уже не «планируемое время», а actual time, реальные цифры, пиздец как полезные. Прямо покажет, где планировщик обманулся, как последняя мартышлюшка.

Так в чём, блядь, соль?

  • EXPLAIN — это ГИПОТЕЗА, гадание на кофейной гуще от СУБД.
  • EXPLAIN ANALYZE — это ОТЧЁТ ПО ФАКТУ, где всё по-чесноку, с реальными замерами и признаниями «ой, я тут ошибся, прости».

ВНИМАНИЕ, КАПСЛОКОМ ДЛЯ ОСОБО ОДАРЁННЫХ: EXPLAIN ANALYZE на запросах UPDATE, DELETE, INSERT РЕАЛЬНО ИЗМЕНИТ ТВОИ ДАННЫЕ! Ты ж не хочешь на продовой базе всё случайно удалить, пидарас шерстяной? Для таких трюков оборачивай всё в транзакцию и тут же ROLLBACK, чтобы просто посмотреть план, но не нагадить.

BEGIN;
EXPLAIN ANALYZE DELETE FROM temp_logs WHERE created_at < now() - interval '30 days';
ROLLBACK; -- ВАЖНЕЙШАЯ СТРОКА, БЛЯДЬ!

Вот и вся магия, ебать мои старые костыли. Сначала EXPLAIN для быстрой прикидки, а если что-то не так — EXPLAIN ANALYZE для вскрытия правды, какой бы горькой она ни была.