Карта / SQL / План запроса (EXPLAIN)

План запроса (EXPLAIN)

EXPLAIN показывает, как именно база собирается выполнить запрос — какой путь выберет: полный перебор таблицы или использует индекс, в каком порядке будет соединять таблицы в JOIN. Это главный инструмент диагностики “почему запрос медленный”.

EXPLAIN SELECT * FROM users WHERE email = 'artur@mail.ru';
Seq Scan on users  (cost=0.00..18.50 rows=1 width=64)
  Filter: (email = 'artur@mail.ru'::text)

Seq Scan — последовательное сканирование, значит индекс не используется — на большой таблице это сигнал, что стоит добавить индекс.

Копнуть глубже

После добавления индекса план меняется:

Index Scan using idx_users_email on users  (cost=0.29..8.31 rows=1 width=64)
  Index Cond: (email = 'artur@mail.ru'::text)

Index Scan вместо Seq Scan — теперь база использует индекс, и cost (условная стоимость выполнения) сильно меньше.

EXPLAIN ANALYZE — то же самое, но реально выполняет запрос и показывает фактическое время:

EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'artur@mail.ru';

Разница важна: обычный EXPLAIN показывает предполагаемый план (на основе статистики базы), ANALYZE — что произошло на самом деле. Иногда они расходятся — это сигнал, что статистика базы устарела (нужно обновить через ANALYZE users; — без EXPLAIN).

🎤 Закрыл тему, если можешь объяснить:
• зачем нужен EXPLAIN и что значит Seq Scan vs Index Scan;
• разницу между EXPLAIN и EXPLAIN ANALYZE (если дошёл до 2-го слоя).