Зачем
EXPLAIN ANALYZE показывает как PostgreSQL выполнит запрос. Без него оптимизация — гадание.
Базовый пример
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 12345;
Возможные планы:
- Index Scan using orders_user_id_idx on orders — есть индекс, быстро
- Seq Scan on orders — полный перебор таблицы, медленно
- Parallel Seq Scan — перебор в несколько потоков
На что смотреть
- cost=X..Y — оценка стоимости (relative units)
- actual time=X..Y ms — реальное время
- rows=X (actual rows=Y) — оценка vs реальность
- Buffers (с EXPLAIN ANALYZE BUFFERS) — сколько страниц прочитано
Типичные проблемы
Seq Scan вместо Index Scan
- Нет индекса на колонке WHERE
- Селективность плохая (фильтр пропускает >10% строк)
- Используется функция: WHERE LOWER(email) = ... — индекс не сработает
CREATE INDEX idx_email_lower ON users (LOWER(email));
Nested Loop на больших таблицах
- Plan выбрал nested loop на 1М × 1М → катастрофа
- Решение: SET enable_nestloop = off; для запроса
Кейс из Air Astana
Аналитик жаловался: SQL по бронированиям 3 минуты. EXPLAIN показал Seq Scan на bookings (50M rows). Создали индекс на flight_date — запрос стал 0.3 секунды.