Анализируем «слона» по частям

    Если вы регулярно отлаживаете производительность запросов к PostgreSQL, а EXPLAIN (ANALYZE, BUFFERS) ... — любимый инструмент познания особенностей работы этой СУБД, то новые полезные «фишки» нашего сервиса визуализации и анализа планов explain.tensor.ru наверняка пригодятся вам в этом нелегком деле.

    Но сразу напомню, что без полноценного всестороннего мониторинга базы PostgreSQL использовать только анализ плана — это выступать с позиции мудреца #5!


    [источник КДПВ, «Слепые и слон»]

    Самуил Маршак, 1940
    Ученый спор

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

    Другой по хоботу слона
    Провел рукой своей
    И заявил, что слон — одна
    Из безопасных змей.

    Ощупал третий два клыка,
    И утверждает он:
    — На два отточенных штыка
    Похож индийский слон!

    Слепец четвертый, почесав
    Колено у слона,
    Установил, что слон шершав,
    Как старая сосна.

    А пятый, подойдя к слону
    Со стороны хвоста,
    Определил, что слон в длину
    Не больше чем глиста.

    Возникли распри у слепцов
    И длились целый год.
    Потом слепцы в конце концов
    Пустили руки в ход.

    А так как пятый был силен,
    — Он всем зажал уста.
    И состоит отныне слон
    Из одного хвоста!

    Итак, сегодня в программе:

    • меняем «шевроны» на «погоны»
    • сводим «мега»-планы
    • ведем персональный архив
    • изучаем генеалогию планов
    • всматриваемся в «окна»

    Не цветом единым!


    Исторически, при просмотре плана самые «горячие» узлы мы отмечали вертикальным «шевроном» слева от значения — чем больше значение, тем насыщеннее цвет.



    Но в такой модели плохо воспринимается соотношение величин — например, отклонение на 30% по разнице в оттенках может заметить только натренированный глаз. Поэтому мы сделали гистограмму из горизонтальных «погонов».



    Полезная статистика для «мега»-планов


    Многие не замечают у плана вкладку «Статистика», вот она справа:


    А кто и заметил — вряд ли активно пользовался. Мы решили исправить это упущение, и сделать ее действительно полезной для анализа «крупногабаритных» планов (100+ узлов).

    Группировка узлов


    Все «одинаковые» узлы плана (то есть те, у которых совпадают тип узла, использованная таблица и индекс) группируются в одну строку таблицы. При этом все их показатели (время выполнения, количество прочитанных и отброшенных записей, общее число проходов и объем прочитанных данных) — суммируются.

    А для наглядности каждый тип узла несет цветовую метку:

    • красная — чтение данных
      узлы Seq Scan, Index Scan, CTE Scan и разные другие ... Scan
    • желтая — обработка данных
      узлы Sort, Unique, Aggregate, Group, Materialize, ...
    • зеленая — соединения
      узлы Nested Loop, Merge Join, Hash Join, ...


    Сортировка по любому показателю


    Если вдруг вам требуется анализ не по суммарному времени, а типу узла, например — просто кликните по заголовку столбца — и все будет:



    Контекстная подсказка узла


    Чтобы детально понять вклад конкретного узла в группе, наведите на номер любого из них — и увидите традиционную подсказку, что конкретно там происходило:



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

    «Без регистрации и SMS!»

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


    Генеалогия планов


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

    Просто укажите имя при добавлении плана:



    … или на уже существующем плане вы можете задать его, отредактировать или добавить связанный план:



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



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


    Всматриваемся в «окна»


    Небольшое, но полезное усовершенствование Query Profiler, о котором я писал ранее — мы научили его «заглядывать в окна» и правильно сопоставлять с узлами плана:

    ->  WindowAgg   ==>  WINDOW / OVER
          ->  Sort  ==>    PARTITION BY / ORDER BY

    … как несколько независимых определений «окна» (WINDOW) в рамках одного запроса:



    … так и сортировки в оконных функциях без явного определения:



    Удачной охоты на разные неэффективности!
    Тензор
    Разработчик системы СБИС

    Комментарии 4

      0

      Спасибо, полезный инструмент.


      Еще раз очень попрошу сделать английскую версию. Отправил бы ссылку зарубежным коллегам, но для них это все равно что на китайском. Я помню что мне ответили — мол, в планах нет, но тем не менее, может, рассмотрите этот реквест?


      И можно ли сделать чекбокс "не публиковать в архиве" по умолчанию включенным? Или запоминать его, скажем, в куки или в сессии. У меня клиенты прямо очень боятся раскрывать хоть какие-то детали работы. А ваш архив доступен на публику весь. Может быть сделать его персональным только для зарегистрированного пользователя?

        0
        Иноязычные версии продолжаем держать в уме.
        У меня клиенты прямо очень боятся раскрывать хоть какие-то детали работы. А ваш архив доступен на публику весь.
        Только если галочка не стоит. :)
        В любом случае, «свой» план можно всегда удалить совсем. Обещаю подумать над регистрацией и механикой публичности планов.
        0
        Для Percona / MariaDB раньше юзал
        Navicat Query Analyzer
        Эта штука только для PG? Выглядит внушающе )

          +1
          Для любой СУБД, которая формирует аналогичный по структуре и узлам план. Сейчас ведем доработки для возможности анализа планов от Citus и Greenplum.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое