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

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

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

bp9ywauinljdemckkufekndsu8a.png


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

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

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

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

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

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

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

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

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


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

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


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


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

qgonchxrznu2pjrx60ctet6rmpu.png

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

adnsv9bo5skbo1tl1f0or_foj2i.png

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


Многие не замечают у плана вкладку «Статистика», вот она справа:
gc-1oqqzqr-e0szug8tkwjwilzs.png

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

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


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

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

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

h_bv4bi1bf1rnfnjjbhtcbfrdsa.png

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


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

lp-mrmvowpsumynbraffxfb3md0.png

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


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

7ceg0icileqzjp98pja7wnk68da.png

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

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

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

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


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

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

xdah7cxs4l8podzwt2a4k0htxdy.png

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

gdbdznibpmyhzvvngfrnjrda9uc.png

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

5fjmhr_gwyd1n9clyt4-jg9qydg.png

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

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


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

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


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

ddlztwszwywom2vxivyex3rtjd4.png

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

8vqnmrfdoooo2fes1dowb_bio94.png

Удачной охоты на разные неэффективности!

© Habrahabr.ru