EXPLAIN visualizer
EXPLAIN visualizer превращает текстовый план запроса в дерево узлов, которое можно читать, сравнивать и красить по разным метрикам. Заменяет ручное чтение EXPLAIN (ANALYZE, BUFFERS) и сторонние сервисы.
Запуск
| Действие |
Сочетание |
| EXPLAIN (без выполнения, оценка плана) |
⌘+E |
| EXPLAIN ANALYZE (с реальным выполнением) |
⌘+Shift+E |
На production-подключении EXPLAIN ANALYZE действительно выполняет запрос — то есть DELETE или UPDATE тоже отработают. Используйте EXPLAIN (без ANALYZE) для проверки оценки или оборачивайте в BEGIN; ... ROLLBACK;.
После запуска ide99 откроет таб Plan с деревом узлов.
Дерево плана
Узлы расположены сверху вниз: корень (последняя операция) — наверху, листья (Seq Scan, Index Scan) — снизу. У каждого узла:
- Тип:
Seq Scan, Hash Join, Sort, Aggregate, Limit и так далее
- Имя таблицы / условие (если применимо)
- Длительность (
Actual Total Time)
- Полоса-индикатор пропорциональна длительности (визуально видно «горячие» узлы)
Кликните по узлу — справа развернётся боковая панель со всеми метриками: cost (Startup Cost / Total Cost), rows (Plan Rows / Actual Rows), buffers (Shared Hit / Shared Read), временем чтения и записи дисковых блоков.
Heatmap
Сверху-справа от диаграммы — переключатель: none · duration · rows · cost. Меняет цвет узлов и заливку:
- none — нейтрально (по умолчанию).
- duration — узлы окрашиваются по
Actual Total Time относительно самого долгого. Красный = ваш bottleneck.
- rows — по
Actual Rows × Loops. Видно, где Postgres перелопачивает миллионы строк.
- cost — по
Total Cost. Полезно для сравнения «дорогих» оценок.
Самый частый паттерн: переключаете в duration, ищете единственный красный узел — это и есть проблема.
Авто-инсайты
Над диаграммой — collapsible-блок «Insights». Если ide99 заметил типовые проблемы, они попадут сюда:
Seq Scan на таблице с >100К строк, при этом подходящий индекс отсутствует
Sort с Disk (work_mem переполнился, сортировка ушла на диск)
Bitmap Heap Scan со сбойной recheck-проверкой (статистика устарела)
Hash Join с Batches > 1 (hash table не помещается в work_mem)
Nested Loop с большим внешним relation (часто ошибка планировщика, помогает ANALYZE)
- Загнутая оценка строк:
Actual Rows / Plan Rows > 100× (намёк на устаревшую статистику)
Каждый insight кликабелен — переводит на конкретный узел.
Plan diff (до и после индекса)
Один из самых полезных режимов: сравнить два плана бок-о-бок.
- Запустите
EXPLAIN ANALYZE на текущем запросе → план A сохраняется.
- Создайте индекс или поправьте запрос.
- Снова
EXPLAIN ANALYZE → откроется кнопка «Compare to previous».
- Откроется side-by-side: слева план A, справа план B. Узлы, которые ускорились — зелёные, замедлились — красные.
Recent Plans
ide99 локально сохраняет последние ~200 планов на каждое подключение. Открыть: иконка History в шапке EXPLAIN-таба или Cmd+P в визуализаторе.
В списке: запрос, длительность, время выполнения, тип узлов. Поиск по тексту запроса или имени таблицы. Двойной клик — загружает план, можно делать diff с текущим.
Если ваше подключение помечено Исключить из recent plans — этот конкретный коннект писать не будет. Полезно для prod-баз с PII.
Экспорт
Кнопка Export в шапке таба — скачивает JSON плана. Можно открыть в pev2.dev, поделиться на форуме, приложить к bug-репорту.
Совет: что читать в плане первым делом
- Проверьте, что Heatmap =
duration. Без этого вы читаете план «вслепую».
- Найдите красный узел. Это ваш bottleneck — обычно
Seq Scan или Sort.
- Посмотрите Plan Rows vs Actual Rows. Если разница в 100+ раз — статистика устарела, запустите
ANALYZE <таблица>.
- Проверьте панель Insights. Часто там уже написано, что делать.
Что дальше