Перейти к содержанию

Форматер плана EXPLAIN для SQL

Преобразуйте выходные данные EXPLAIN или EXPLAIN ANALYZE в читаемое дерево операций с выделением медленных частей.

Входные данные
Выходные данные

Форматер плана EXPLAIN для SQL

Вставьте сырой вывод EXPLAIN или EXPLAIN ANALYZE, и этот инструмент превращает стену текста в отступанное дерево операций с выстроенными рядом затратами, количеством строк и временем каждого узла. Вместо сканирования плотного блока аннотаций "cost=… rows=… actual time=…" вы получите форму, которую можно прочитать с первого взгляда — какой скан питает какое соединение и где запрос на самом деле тратит свое время.

Выберите диалект, соответствующий вашей БД: PostgreSQL и MySQL EXPLAIN ANALYZE используют одно и то же отступанное дерево "-> ", классический (не-ANALYZE) EXPLAIN MySQL анализируется строка за строкой, а SQLite EXPLAIN QUERY PLAN получает собственное ASCII-дерево и форматы id/parent. Вставляйте простой текст или переключайте формат входа на JSON для PostgreSQL EXPLAIN (FORMAT JSON) и MySQL EXPLAIN FORMAT=JSON вывода. Переключение "Показывать строки" контролирует оценочные и фактические цифры строк, порог дорогостоящих операций контролирует, какой процент от общей стоимости или времени заслуживает узел флаг "дорогостоящий", а "Скрывать узлы" позволяет обрезать ветки с низкой стоимостью из длинного плана, чтобы выбросы выделялись. Переключайтесь между отступанным деревом и простой выстроенной таблицей.

Стоимость и время, которые каждый узел отчитывает, являются кумулятивными — они уже включают каждое дитя снизу — поэтому инструмент вычитает каждого потомка узла перед ранжированием чего-либо, это предотвращает то, что узел верхнего уровня запроса всегда выглядит как "дорогостоящий". Строка сводки под планом подсчитывает операции, считает количество отмеченных и называет самую медленную ветку от корня к листу, поэтому вы знаете ровно, какую цепочку операций исследовать в первую очередь.

Все работает локально в вашем браузере — план запроса может раскрыть имена таблиц и индексов, которые вы бы предпочли не вставлять в случайную веб-форму, и ничего из этого не передается никуда. Скопируйте отформатированное дерево, загрузите его как файл .txt или отправьте выход обратно во вход, чтобы отрегулировать порог и переформатировать.

FAQ

Какие форматы EXPLAIN это понимает?
Выходные данные дерева PostgreSQL и MySQL 8 EXPLAIN ANALYZE, классический табличный EXPLAIN MySQL, SQLite EXPLAIN QUERY PLAN (как его ASCII-дерево, так и сырые строки id/parent/detail), плюс форматы JSON плана PostgreSQL и MySQL.
Почему узел верхнего уровня не всегда отмечается как дорогостоящий?
Затраты и время, которые узел отчитывает, уже включают все, что под ним, поэтому инструмент сравнивает собственную долю каждого узла после вычитания его дочерних элементов — это то, что указывает на фактическое узкое место вместо постоянного выделения корня.
Что происходит, если план SQLite не содержит данных затрат?
SQLite EXPLAIN QUERY PLAN не отчитывает затраты или время, поэтому дерево по-прежнему форматируется, и сводка говорит об этом честно вместо того, чтобы гадать на основе выделения.
"Скрывать узлы ниже" удаляет что-либо из моего плана?
Нет — это только опускает низкодоходные строки из этого представления. Корневая операция всегда остается видимой, чтобы дерево сохраняло якорь; снова запустите с более низким порогом, чтобы увидеть все снова.
Мой план запроса загружается где-то?
Нет. Анализ и форматирование происходят полностью в вашем браузере — план и все имена таблиц и индексов в нем никогда не покидают ваше устройство.