Что делает EXPLAIN для SQL-запроса?
- Как читать план запроса?
- Что такое 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) — сколько страниц прочитано из кэша и с диска
Подробно
Что в плане: дерево узлов. Листья — чтение таблиц, выше — соединения, сортировки, агрегаты. У каждого узла оценка стоимости (условные единицы), ожидаемое число строк и ширина строки.
Способы чтения:
- 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 вне транзакции с откатом.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Показывает план выполнения, выбранный оптимизатором
- ✗Выполняет запрос и сохраняет его план в кэше, чтобы ускорить повторные вызовы
- ✗Гарантированно ускоряет запрос
- ✗Удаляет неиспользуемые индексы
Что спросят дальше
- Что такое sequential scan?
- Чем EXPLAIN ANALYZE опасен для write-запросов?
Разбор темы
- Практика оптимизации запросов
EXPLAIN и чтение плана, порядок колонок индекса, keyset-пагинация и ловушки, мешающие индексу.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.