Gymterview
middle

Как использовать EXPLAIN и EXPLAIN ANALYZE для анализа запросов?

EXPLAIN показывает план выполнения запроса — как PostgreSQL собирается его выполнять. EXPLAIN ANALYZE фактически выполняет запрос и показывает реальное время и количество строк. Это главный инструмент диагностики медленных запросов.

Пример
-- Только план (запрос НЕ выполняется)
EXPLAIN
SELECT * FROM transactions WHERE account_id = 100;

-- План + реальное выполнение
EXPLAIN ANALYZE
SELECT * FROM transactions WHERE account_id = 100;

-- Расширенный вывод с буферами
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM transactions WHERE account_id = 100;

Пример вывода EXPLAIN ANALYZE

Пример
Index Scan using idx_tx_account on transactions  (cost=0.43..8.45 rows=1 width=64) (actual time=0.021..0.023 rows=1 loops=1)
  Index Cond: (account_id = 100)
  Buffers: shared hit=3
Planning Time: 0.085 ms
Execution Time: 0.045 ms

Ключевые метрики

  • cost=0.43..8.45 — оценка стоимости (начало…итого) в условных единицах
  • rows=1 — ожидаемое количество строк
  • actual time=0.021..0.023 — реальное время (мс) первой строки…последней строки
  • rows=1 (actual) — реальное количество строк
  • loops=1 — сколько раз узел выполнялся
  • Buffers: shared hit=3 — прочитано 3 страницы из кеша

Осторожно с модифицирующими запросами

EXPLAIN ANALYZE для UPDATE, DELETE, INSERT выполняет операцию! Оборачивайте в транзакцию:

Пример
BEGIN;
EXPLAIN ANALYZE UPDATE transactions SET status = 'DONE' WHERE id = 1;
ROLLBACK;

На собеседовании: обязательно упомяните, что EXPLAIN ANALYZE реально выполняет запрос. Для DML-запросов — всегда BEGIN/ROLLBACK. Расхождение между estimated и actual rows — признак устаревшей статистики, решается через ANALYZE table_name.