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.