Вчера Hubert 'depesz' Lubaczewski закрыл доступ с российских IP ко всем своим сайтам, включая широко известный визуализатор планов PostgreSQL-запросов explain.depesz.com.
Но это не беда, потому что в компании "Тензор" мы разработали сервис explain.tensor.ru, функционал которого гораздо обширнее, и которым можете воспользоваться и вы.
![](https://habrastorage.org/getpro/habr/upload_files/9ba/fa0/db4/9bafa0db41254fb9e6c604cd5a372fb4.png)
Анализируем планы любой сложности...
Сокращенное дерево плана позволяет легко увидеть алгоритм выполнения запроса, все числовые показатели которого выводятся отдельно и акцентируются цветовыми метками пропорционально нагрузке.
![Сокращенное отображение плана Сокращенное отображение плана](https://habrastorage.org/getpro/habr/upload_files/de8/cdb/fac/de8cdbfac7249755ff4b9c4daa5e4131.png)
Сводная статистика узлов дает возможность анализировать планы из десятков тысяч строк в агрегированном виде с сортировкой по любому показателю: времени выполнения или чтения с диска, объему полученных из кэша данных или количеству отфильтрованных строк.
![Сводная статистика узлов Сводная статистика узлов](https://habrastorage.org/getpro/habr/upload_files/786/6e1/63f/7866e163f2f7c5b93144ceeffeab92f2.png)
Корректный анализ CTE Scan при повторных обращениях к одной и той же CTE или частичных чтениях из wCTE правильно распределяет время и ресурсы по фактически потребившим их узлам.
![Распределение ресурсов CTE Распределение ресурсов CTE](https://habrastorage.org/getpro/habr/upload_files/75a/da4/ee8/75ada4ee8a81f0eff49d692cd9be083f.png)
Анализ параллельных узлов суммирует, а не усредняет, время выполнения с учетом распределения по всем задействованным ядрам CPU для выявления точек дальнейшей оптимизации нагрузки на сервер.
!["Параллельные" узлы "Параллельные" узлы](https://habrastorage.org/getpro/habr/upload_files/dff/353/11b/dff35311b918c34fac4448fc6cf8b031.png)
Разбор дополнительных строк Planning, Execution, JIT и Settings помогает понять, насколько много ресурсов ушло на подготовку плана еще до начала его исполнения, и какие из возможных оптимизаций и параметров были использованы для запроса.
![Анализ дополнительных строк Анализ дополнительных строк](https://habrastorage.org/getpro/habr/upload_files/6b1/8a1/f69/6b18a1f69ddf1ed619400d68910c4641.png)
... из произвольных источников...
Разные форматы планов будут разобраны, независимо от способа их получения: из консоли с разбиением строк по ширине экрана или как часть лога вместе с запросом, в формате JSON, YAML или экспорт в виде CSV, с лишними обрамляющими кавычками, скопированными из pgAdmin, или без них.
![Запрос и план в одном куске лога Запрос и план в одном куске лога](https://habrastorage.org/getpro/habr/upload_files/1b9/ddd/7bd/1b9ddd7bda345cc33bfed4e3ab3cd9e5.png)
Последние версии PostgreSQL генерируют планы с новыми типами узлов Incremental Sort, Result Cache, Async Foreign Scan и Index Skip Scan, но даже они не доставят проблем при анализе запроса.
![Incremental Sort появился в v13 Incremental Sort появился в v13](https://habrastorage.org/getpro/habr/upload_files/5b7/bae/ead/5b7baeead61428a298fa754c365a8095.png)
Поддержка enterprise-«форков» позволяет воспользоваться всеми вариантами визуализации планов, сгенерированных не только «ванильным» PostgreSQL, но и любым из специализированных корпоративных решений на его основе: Greenplum, Citus, TimescaleDB и Amazon RedShift.
![](https://habrastorage.org/getpro/habr/upload_files/b86/5ea/8eb/b865ea8ebfd0e0fcd5b0925c142d503a.png)
... с нескольких точек зрения...
Круговая диаграмма помогает легко определить доминирующие узлы и примерное соотношение их долей в потреблении ресурсов.
![Визуализация круговой диаграммой Визуализация круговой диаграммой](https://habrastorage.org/getpro/habr/upload_files/707/b0c/ec6/707b0cec61e9533a140a0e3b6b37c0cf.png)
Визуализация «плиткой» позволяет компактно оценить связь узлов в больших планах и выделить участок запроса, где возникла проблема.
![Визуализация "плиткой" Визуализация "плиткой"](https://habrastorage.org/getpro/habr/upload_files/f73/37c/b44/f7337cb4414291c251a5ef23c0d78129.png)
Диаграмма выполнения с возможностью масштабирования дает возможность целиком окинуть взглядом будущее "поле боя за производительность" и увидеть реальные зависимости узлов и «потоков» ресурсов.
!["Потоки" ресурсов "Потоки" ресурсов](https://habrastorage.org/getpro/habr/upload_files/976/73e/288/97673e2886a4f0cbc597bf613cc75903.png)
... и с дополнительными удобствами
Интеллектуальные рекомендации, автоматически генерируемые на основе анализа структуры и ресурсных показателей плана, подскажут вам, в чем именно заключается проблема производительности запроса, и как ее можно легко устранить.
![Интеллектуальные рекомендации Интеллектуальные рекомендации](https://habrastorage.org/getpro/habr/upload_files/9dd/642/73f/9dd64273fbe4e59e1baf6a080747bead.png)
Персональный архив доступен только вам и содержит все анализировавшиеся вами планы, позволяя мгновенно вернуться к ним, независимо от публикации в общем архиве.
![Персональный архив планов Персональный архив планов](https://habrastorage.org/getpro/habr/upload_files/fcf/822/471/fcf82247198a3c973584a8f333c66554.png)
Дерево оптимизаций c именами планов помогает создать наиболее эффективный вариант запроса или вернуться к одному из предыдущих.
![Дерево оптимизаций запроса Дерево оптимизаций запроса](https://habrastorage.org/getpro/habr/upload_files/495/b40/3b1/495b403b14764d12f06bcb12f5390532.png)
Сопоставление плана и запроса дает возможность одним кликом перейти от проблемного узла в плане к соответствующей точке в запросе и обратно, даже если они занимают по несколько экранов.
![Сопоставление узла плана и элемента запроса Сопоставление узла плана и элемента запроса](https://habrastorage.org/getpro/habr/upload_files/51d/482/f27/51d482f27e5cdbd34d532c879ccaa203.png)
Нормализатор запросов в их единое визуальное представление с построчным профайлером позволяет с первого взгляда заметить, что именно пошло «не так».
![Приведение запросов к единому виду Приведение запросов к единому виду](https://habrastorage.org/getpro/habr/upload_files/88c/784/46f/88c78446fce9f250455588e11439c9ba.png)
А еще...
Мониторинг размера resultset для поиска запросов, которые слишком много гоняют по сети.
![1405 строк по 101 байту - получается примерно 139KB к передаче 1405 строк по 101 байту - получается примерно 139KB к передаче](https://habrastorage.org/getpro/habr/upload_files/0d5/87c/621/0d587c621d59441e2c183ec2a05b5efa.png)
Подсветка значений - числовых, строковых и "атрибутных" - в развернутом виде узла, чтобы их можно было почти мгновенно заметить.
![Подсветка значений в узле плана Подсветка значений в узле плана](https://habrastorage.org/getpro/habr/upload_files/234/f3b/9e3/234f3b9e3cd9c774c3f464939b5c57f1.png)
Отметка фильтрующих узлов поможет намного проще обнаружить точки, где отбрасываются какие-то из уже прочитанных из базы записей - у каждого такого узла слева есть метка с цветом, соответствующим доле отфильтрованного.
![Отброшено 99% записей Отброшено 99% записей](https://habrastorage.org/getpro/habr/upload_files/0ac/cd9/bb0/0accd9bb05e35af1a434023a15d0ef13.png)
Иерархия сложных планов со множеством вложенных CTE/InitPlan/SubPlan позволяет наглядно отследить, где кончается поддерево конкретного узла, и кто является его прямыми потомками.
![Сложная иерархия с двумя CTE Сложная иерархия с двумя CTE](https://habrastorage.org/getpro/habr/upload_files/485/79a/233/48579a233b83762bc58f7c5169b97a15.png)
Мы поддержали работу сервиса не только "на русском", но и на других языках. Пока - только на английском, зато полноценно, включая и перевод рекомендательных подсказок.
А чтобы коллегу можно было оперативно подключить к анализу проблем, добавлена возможность оперативно "расшарить" ссылку на план через популярные мессенджеры, соцсети или почту.
![Обсуждайте проблемный план там, где вам удобно Обсуждайте проблемный план там, где вам удобно](https://habrastorage.org/getpro/habr/upload_files/a8c/8d3/bba/a8c8d3bbac81b9a19005af440f5a75b5.png)
Публичный API
Вы можете автоматизировать отправку планов из своих систем для их визуализации и дальнейшего анализа, используя API нашего сервиса:
curl -X POST https://explain.tensor.ru/explain \
-H "Content-Type: application/json" \
-d @FILENAME
# тут FILENAME – путь к файлу, содержащему параметры вызова в виде JSON-объекта
Пользуйтесь!