Зачем

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 — перебор в несколько потоков

На что смотреть

  1. cost=X..Y — оценка стоимости (relative units)
  2. actual time=X..Y ms — реальное время
  3. rows=X (actual rows=Y) — оценка vs реальность
  4. 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 секунды.