План выполнения запроса: чтение и анализ вывода EXPLAIN
Что такое EXPLAIN и зачем он нужен?
Когда SQL-запрос работает медленно, EXPLAIN становится вашим детективным инструментом 🔍. Он показывает план выполнения — пошаговую инструкцию, как СУБД будет обрабатывать ваш запрос.
Без EXPLAIN оптимизация запросов — это стрельба вслепую. С ним — точная настройка под капотом базы данных!
Базовый синтаксис
Просто добавьте EXPLAIN перед вашим запросом:
EXPLAIN SELECT * FROM users WHERE age > 30;
Для более детального анализа (в PostgreSQL) используйте:
EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'completed';
👉 ANALYZE не только показывает план, но и выполняет запрос, добавляя реальные метрики (время, строки).
Разбираем вывод EXPLAIN
Вывод EXPLAIN — это дерево операций. Вот как его читать:
1. Типы узлов (операций)
Seq Scan— последовательное чтение всей таблицы (часто медленно!).Index Scan— использование индекса (быстрее, но не всегда идеально).Nested Loop— вложенные циклы для соединения таблиц.Hash Join/Merge Join— альтернативные методы соединения.
2. Ключевые метрики
cost=0.00..10.00— прогнозируемые затраты (первое число — старт, второе — завершение).rows=100— ожидаемое количество строк.width=32— средний размер строки в байтах.
Пример разбора реального плана
Допустим, у нас есть запрос:
EXPLAIN SELECT u.name, o.amount
FROM users u JOIN orders o ON u.id = o.user_id
WHERE u.country = 'Germany';
Вывод может выглядеть так:
Hash Join (cost=15.30..45.50 rows=120 width=64)
Hash Cond: (o.user_id = u.id)
-> Seq Scan on orders o (cost=0.00..20.00 rows=1000 width=16)
-> Hash (cost=14.80..14.80 rows=40 width=48)
-> Seq Scan on users u (cost=0.00..14.80 rows=40 width=48)
Filter: (country = 'Germany')
Что здесь происходит?
- Сначала PostgreSQL сканирует таблицу
users(Seq Scan), фильтруя поcountry. - Затем строит хэш-таблицу (
Hash) для быстрого соединения. - В конце —
Hash Joinс таблицейorders.
💡 Проблема: Seq Scan на users может быть медленным. Решение — добавить индекс на country:
CREATE INDEX idx_users_country ON users(country);
Оптимизация через EXPLAIN
Когда использовать индексы?
- Если видите
Seq Scanна большой таблице — вероятно, нужен индекс. - Но индексы замедляют вставку данных — баланс важен!
Как избежать «узких мест»?
EXPLAIN ANALYZEпокажет, если реальныеrowsсильно отличаются от прогноза (плохая статистика).LIMITможет изменить план выполнения — проверяйте оба варианта!
Продвинутые фишки
Форматирование вывода (PostgreSQL)
EXPLAIN (FORMAT JSON) SELECT * FROM products;
Подходит для визуализации в инструментах типа PEV (PostgreSQL Explain Visualizer).
Проверка работы индексов
EXPLAIN SELECT * FROM users WHERE email LIKE 'user%@example.com';
Если видите Index Scan — ваш индекс работает. Если Seq Scan — возможно, паттерн поиска неэффективен.
Практика — ключ к мастерству
Попробуйте на своей базе:
1. Возьмите медленный запрос.
2. Добавьте EXPLAIN ANALYZE.
3. Найдите «тяжелые» операции (Seq Scan, сортировки без индексов).
4. Оптимизируйте и проверьте снова!
🚀 Чем чаще вы используете EXPLAIN, тем интуитивнее становится анализ!