Короткий ответ
EXPLAIN показывает, какой план выполнения СУБД выбрала для запроса — какие таблицы и в каком порядке читаются, используются ли индексы или полное сканирование таблицы — и помогает понять, почему запрос работает медленно, до того как его запустят на полных данных.
Как это работает подробнее
EXPLAIN (без ANALYZE) строит предполагаемый план на основе статистики таблиц без фактического выполнения запроса, а EXPLAIN ANALYZE реально выполняет запрос и добавляет к плану фактическое время и количество обработанных строк на каждом шаге.
Пример кода
question-34.sql
EXPLAIN SELECT * FROM orders WHERE customer_id = 12345;Что использовать на практике
- на базовом уровне аналитику достаточно уметь заметить признаки проблемы — например, «Seq Scan» (полное сканирование таблицы) на очень большой таблице там, где ожидался индексный поиск, или то, что оценка числа строк на одном из шагов плана сильно расходится с фактической. Если в плане видно «Seq Scan on orders», а таблица на миллионы строк, это сигнал задуматься об индексе на
customer_id. Проверка: после создания индекса повторныйEXPLAINдолжен показать «Index Scan» вместо «Seq Scan».
Подводные камни
- запускают
EXPLAIN ANALYZEна запросе сINSERT/UPDATE/DELETEв проде, не понимая, чтоANALYZEфактически выполняет запрос (и, соответственно, реально меняет данные), а не только показывает план «в сухую».