«Импортозамещаем» анализ планов PostgreSQL

Вчера Hubert 'depesz' Lubaczewski закрыл доступ с российских IP ко всем своим сайтам, включая широко известный визуализатор планов PostgreSQL-запросов explain.depesz.com.

Но это не беда, потому что в компании «Тензор» мы разработали сервис explain.tensor.ru, функционал которого гораздо обширнее, и которым можете воспользоваться и вы.

9bafa0db41254fb9e6c604cd5a372fb4.png

Анализируем планы любой сложности…

Сокращенное дерево плана позволяет легко увидеть алгоритм выполнения запроса, все числовые показатели которого выводятся отдельно и акцентируются цветовыми метками пропорционально нагрузке.

Сокращенное отображение планаСокращенное отображение плана

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

Сводная статистика узловСводная статистика узлов

Корректный анализ CTE Scan при повторных обращениях к одной и той же CTE или частичных чтениях из wCTE правильно распределяет время и ресурсы по фактически потребившим их узлам.

Распределение ресурсов CTEРаспределение ресурсов CTE

Анализ параллельных узлов суммирует, а не усредняет, время выполнения с учетом распределения по всем задействованным ядрам CPU для выявления точек дальнейшей оптимизации нагрузки на сервер.

«Параллельные» узлы

Разбор дополнительных строк Planning, Execution, JIT и Settings помогает понять, насколько много ресурсов ушло на подготовку плана еще до начала его исполнения, и какие из возможных оптимизаций и параметров были использованы для запроса.

Анализ дополнительных строкАнализ дополнительных строк

… из произвольных источников…

Разные форматы планов будут разобраны, независимо от способа их получения: из консоли с разбиением строк по ширине экрана или как часть лога вместе с запросом, в формате JSON, YAML или экспорт в виде CSV, с лишними обрамляющими кавычками, скопированными из pgAdmin, или без них.

Запрос и план в одном куске логаЗапрос и план в одном куске лога

Последние версии PostgreSQL генерируют планы с новыми типами узлов Incremental Sort, Result Cache, Async Foreign Scan и Index Skip Scan,  но даже они не доставят проблем при анализе запроса.

Incremental Sort появился в v13Incremental Sort появился в v13

Поддержка enterprise-«форков» позволяет воспользоваться всеми вариантами визуализации планов, сгенерированных не только «ванильным» PostgreSQL, но и любым из специализированных корпоративных решений на его основе:  Greenplum, Citus, TimescaleDB и Amazon RedShift.

b865ea8ebfd0e0fcd5b0925c142d503a.png

… с нескольких точек зрения…

Круговая диаграмма помогает легко определить доминирующие узлы и примерное соотношение их долей в потреблении ресурсов.

Визуализация круговой диаграммойВизуализация круговой диаграммой

Визуализация «плиткой» позволяет компактно оценить связь узлов в больших планах и выделить участок запроса, где возникла проблема.

Визуализация Визуализация «плиткой»

Диаграмма выполнения с возможностью масштабирования дает возможность целиком окинуть взглядом будущее «поле боя за производительность» и увидеть реальные зависимости узлов и «потоков» ресурсов.

«Потоки» ресурсов

… и с дополнительными удобствами

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

Интеллектуальные рекомендацииИнтеллектуальные рекомендации

Персональный архив доступен только вам и содержит все анализировавшиеся вами планы, позволяя мгновенно вернуться к ним, независимо от публикации в общем архиве.

Персональный архив плановПерсональный архив планов

Дерево оптимизаций c именами планов помогает создать наиболее эффективный вариант запроса или вернуться к одному из предыдущих.

Дерево оптимизаций запросаДерево оптимизаций запроса

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

Сопоставление узла плана и элемента запросаСопоставление узла плана и элемента запроса

Нормализатор запросов в их единое визуальное представление с построчным профайлером позволяет с первого взгляда заметить, что именно пошло «не так».

Приведение запросов к единому видуПриведение запросов к единому виду

А еще…

Мониторинг размера resultset для поиска запросов, которые слишком много гоняют по сети.

1405 строк по 101 байту - получается примерно 139KB к передаче1405 строк по 101 байту — получается примерно 139KB к передаче

Подсветка значений — числовых, строковых и «атрибутных» — в развернутом виде узла, чтобы их можно было почти мгновенно заметить.

Подсветка значений в узле планаПодсветка значений в узле плана

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

Отброшено 99% записейОтброшено 99% записей

Иерархия сложных планов со множеством вложенных CTE/InitPlan/SubPlan позволяет наглядно отследить, где кончается поддерево конкретного узла, и кто является его прямыми потомками.

Сложная иерархия с двумя CTEСложная иерархия с двумя CTE

Мы поддержали работу сервиса не только «на русском», но и на других языках. Пока — только на английском, зато полноценно, включая и перевод рекомендательных подсказок.

А чтобы коллегу можно было оперативно подключить к анализу проблем, добавлена возможность оперативно «расшарить» ссылку на план через популярные мессенджеры, соцсети или почту.

Обсуждайте проблемный план там, где вам удобноОбсуждайте проблемный план там, где вам удобно

Публичный API

Вы можете автоматизировать отправку планов из своих систем для их визуализации и дальнейшего анализа, используя API нашего сервиса:

curl -X POST https://explain.tensor.ru/explain \
  -H "Content-Type: application/json" \
  -d  @FILENAME
# тут FILENAME – путь к файлу, содержащему параметры вызова в виде JSON-объекта

Пользуйтесь!

© Habrahabr.ru