Получить доступ

Что делает EXPLAIN для SQL-запроса?

MiddleОптимизация запросовSQLPostgreSQL
Ещё спрашивают так:
  • Как читать план запроса?
  • Что такое Seq Scan и Index Scan?
Коротко

EXPLAIN показывает план, который выбрал оптимизатор: способы чтения таблиц, порядок и алгоритмы соединений, оценки числа строк и стоимости. EXPLAIN ANALYZE ещё и выполняет запрос и показывает фактическое время и строки.

  • Seq Scan — полный просмотр; Index Scan / Index Only Scan / Bitmap Scan — по индексу
  • Соединения: Nested Loop, Hash Join, Merge Join
  • Главное — сравнить оценку строк с фактом: большое расхождение — устаревшая статистика

А ещё EXPLAIN (ANALYZE, BUFFERS) — сколько страниц прочитано из кэша и с диска

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Что в плане: дерево узлов. Листья — чтение таблиц, выше — соединения, сортировки, агрегаты. У каждого узла оценка стоимости (условные единицы), ожидаемое число строк и ширина строки.

Способы чтения:

  • Seq Scan — вся таблица подряд; нормально для маленьких таблиц и запросов, выбирающих большую долю строк;
  • Index Scan — по индексу, затем строки из таблицы;
  • Index Only Scan — только индекс, если он покрывает запрос;
  • Bitmap Index/Heap Scan — собрать адреса из индекса и читать страницы по порядку; для средних выборок и комбинаций индексов.

Соединения: Nested Loop — для малых входов с индексом на внутренней таблице; Hash Join — равенство на больших таблицах; Merge Join — отсортированные входы.

EXPLAIN ANALYZE выполняет запрос (осторожно с UPDATE/DELETE — в транзакции с откатом) и показывает фактическое время каждого узла, фактические строки и число повторений (loops).

Что искать: Seq Scan большой таблицы при выборке нескольких строк; оценка строк сильно отличается от фактической (нужен ANALYZE таблицы или расширенная статистика); сортировка на диске (external merge) — мало work_mem; Nested Loop с миллионами повторений.

Пример

EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42;
Index Scan using orders_customer_idx on orders
  (cost=0.43..8.45 rows=3 width=64) (actual time=0.021..0.025 rows=3 loops=1)
Planning Time: 0.1 ms   Execution Time: 0.05 ms

Что хотят услышать

  • Что показывает EXPLAIN и чем отличается EXPLAIN ANALYZE.
  • Основные типы чтения и соединений.
  • Сравнение оценки строк с фактом и устаревшая статистика.

Частые ошибки

  • Считать любой Seq Scan плохим.
  • Запускать EXPLAIN ANALYZE для DELETE вне транзакции с откатом.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Гарантированно ускоряет запрос
  • ✓Показывает план выполнения, выбранный оптимизатором
  • ✗Удаляет неиспользуемые индексы
  • ✗Преобразует SQL в Java-код

Что спросят дальше

  • Что такое sequential scan?
  • Чем EXPLAIN ANALYZE опасен для write-запросов?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем