Страница запроса из архива
Перейти на эту страницу можно несколькими способами:
нажав на бургер-меню → «Проблемные запросы» и перейти на страницу /Планы → значение в столбце «last» или «time» в зависимости от вкладки, которую вы открыли;
нажав на кнопку «Логи», выбрав нужный параметр просмотра лога, и нажав на ссылку «Перейти к анализу».
нажав на «Перейти к анализу» в развернувшемся плане конкретного запроса страницы «Шаблоны», перейти на которую можно из страницы «Проблемные запросы».
Панель управления страницей
Панель управления страницей содержит следующие элементы (согласно нумерации на рисунке выше):
дата запроса;
кнопка копирования ссылки на данный запрос;
имя;
имя шаблона (переводит на страницу /шаблоны);
кнопка создания ссылки на задачу (её значение описано ниже);
кнопка, вызывающая почтовый клиент для отправки сообщения.
Вкладка «Оригинал»
Здесь можно посмотреть оригинал плана запроса из архива. Вручную его можно получить при использование команды «EXPLAIN<query_text>» на языке SQL. Вместо <query_text> нужно ввести текст вашего запроса.
Вкладка «План»
Во вкладке «План» находится тот же план, что и во вкладке «оригинал», только в более наглядном виде (могут исчезнуть перегружающие знаки препинания, подсвечиваются названия каждого узла плана).
Вкладка «Диаграмма»
Здесь можно увидеть графическое представление плана запроса.
Каждый круг - это отдельный узел плана данного запроса. Наведя курсор мыши на каждую часть диаграммы, можно посмотреть, как распределилось время исполнения запроса, а также другую информацию:
название узла
execution - собственное время выполнения узла (за вычетом выполнения всех его «детей» - вложенных в него узлов или «дочерних» узлов). Если количество повторов данного узла loops больше 1, то для того чтобы узнать всё собственное время выполнения данного узла, нужно execution умножить на количество loops.
доля времени выполнения этого узла от общего выполнения запроса
rows - количество строк, возвращаемых узлом
loops - количество повторов этого узла
cost - стоимость этого узла
width - объём прочитанных строк в байтах
actual time - общее время выполнение узла вместе с его «детьми». Если количество повторов данного узла loops больше 1, то для того чтобы узнать всё время выполнения данного узла (вместе с дочерними узлами), нужно actual time умножить на количество loops
output - результат выполнения данного узла
При нажатии на каждый круг вы перейдёте во вкладку «Explain».
Вкладка «Explain»
Информация, представленная в таблице по столбцам:
1 столбец (node, ms) - собственное время выполнения узла без учёта дочерних (то же самое, что и execution на диаграмме).
2 столбец (io.rd, ms) - результат атрибута explain «track_io_timing», время в миллисекундах, которое было потрачено на то, чтобы прочитать данные с диска. При наведении курсора мыши на значение этого столбца высветится подсказка со скоростью выполнения данной операции.
3 столбец (io.wr, ms) - результат атрибута explain «track_io_timing», время в миллисекундах, которое было потрачено на то, чтобы записать данные на диск. Как и для предыдущего столбца, при наведении курсора мыши на значение этого столбца высветится подсказка со скоростью выполнения данной операции.
4 столбец (tree, ms) - время исполнения всего узла, включая всё поддерево (то же самое, что и actual time на диаграмме).
5 столбец (rows) - фактическое количество строк, возвращаемых узлом (то же самое, что и rows на диаграмме). Если рядом с этим значении находится синий треугольник, то, наведя на него курсор мыши, вы увидите, во сколько фактическое значение количества вернувшихся строк отличается от планового. Если треугольника нет, значит эти два значения совпадают.
6 столбец (loops) - количество повторений данного узла (то же самое, что и loops на диаграмме).
Информацию о том, что находится в каждом столбце, также можно посмотреть в подсказке, которая высветится, если навести курсор мыши на названия столбцов.
Правее перечислены названия узлов. При наведении курсора мыши на строку с конкретным узлом серым цветом подсвечиваются строки с его дочерними узлами. Если нажать на уголок рядом с «итоговыми результатами», то развернётся детализация по каждому узлу плана. Также можно скрывать и раскрывать информацию по каждому узлу отдельно, кликая на стрелочку слева от их названий или просто в пустое поле вокруг узлов.
В первых скобочках детализации узла после слова rows находится количество строк, которое ожидалось получить в результате выполнения данного узла, во вторых - количество строк, которое было фактически получено.
Рассмотрим 4 столбца, которые находятся справа. Они показывают результат одной из опций команды explain - «buffers». Написав «explain buffers <query_text>» на языке SQL, вы можете посмотреть результат этой команды вручную. Она показывает вид памяти, из которой происходило чтение или запись информации, а также объём этой информации в страницах (обычно, в каждой странице 8192 байта данных, если вы ничего не меняли в конфигурации. Вы можете проверить это, написав запрос «show block_size»). Таким образом, эти 4 столбца несут информацию о том, насколько оптимизирован данный запрос из архива по использованию ресурсов:
1 столбец (sh.ht) - shared hit, чтение из кэша, один из самых быстрых способов чтения, именно его нужно стараться преимущественно использоваться в запросах.
2 столбец (sh.rd) - shared read, чтение с диска при отсутствии в кэше. Этого способа чтения лучше избегать, он один из самых медленных.
3 столбец (sh.dr) - чтение из разделяемой памяти сервера, при котором, пока мы пытались получить данные, кто-то их уже изменил, и пришлось искать эти данные уже в другом месте. Быстрый способ чтения.
4 столбец (sh.wr) - запись на диск из разделяемой памяти сервера, это происходит медленно.
Верхние и нижние числа из этих столбцов, подсвеченные разными цветами, показывают значения попадания данных в эти виды памяти из диска и из кэш-памяти.
В строках некоторых узлов есть квадратные значки. Цифры со знаком «#», находящиеся справа от значков, показывают номер узла плана, к которому относится рекомендация. Рекомендации появляются, если часть запроса SQL, связанная с этим узлом, написана неоптимальным образом. Наведясь на такой значок, вы увидите рекомендацию по данному узлу. Если нужна более подробная информация об этой проблеме, можно нажать на ссылку «подробнее» и прочитать статью на эту тему.
Справа кнопка «piechart» («круговая диаграмма»).
Она открывает круговую диаграмму, на которой наглядно представлена доля времени, занимаемая данным узлом запроса в общем выполнении запроса. На диаграмме показаны только два узла из 6ти (в данном примере), потому что время, занимаемое всеми остальными узлами, ничтожно мало.
Наведясь на конкретную долю, вы увидите более подробную информацию о данном узле, а если нажать на эту долю, то в таблице на данной странице синим цветом подсветится строка с этим узлом.
Чуть левее находится вкладка «tilemap».
Этот график тоже показывает различную информацию об узлах плана данного запроса. Например, связь между этими узлами. Чем толще ножка между узлами, тем больше ресурсов они передают. Цвета узлов показывают затратность каждого узла. Узел, на который затрачивается больше всего ресурсов, подсвечивается красными цветом, а тот, на который их тратится меньше всего - зелёным.
Нажав на узел, вы увидите более подробную информацию об этом узле, а если нажать на эту долю, то в таблице на данной странице синим цветом подсветится строка с этим узлом.
Вкладка «Модель»
На этой вкладке представлена упрощённая модель плана запроса из архива, показывающая только названия выполненных узлов и их порядок. Детализация по каждому узлу скрыта.
Вкладка «Отношения»
На этой вкладке представлена схема отношений таблиц, участвующих в данном запросе.
Вкладка «Для ошибки»
На этой странице находится шаблон, с помощью которого, если вы обнаружили ошибку в запросе или то что он не оптимизирован, вы можете создать ошибку и отправить её создателю запроса. В первой строке шаблона ошибки находится метод, который использовал этот запрос. Далее идёт ссылка на конкретный план. Затем написана статистическая информация о том, сколько информации было вычитано запросом использовано на диске за итерацию, за сутки, по шаблону и по методу. И в самом низу приведены первые 10% узлов, которые создали нагрузку. С помощью значка копирования в правом верхнем углу вы можете скопировать текст шаблона для ошибки и отправить его разработчику.
Кнопка создания ссылки на задачу
Нажатие на кнопку |task_link_button| вызывает окно создания ссылки на задачу:
Эта опция нужна для того, чтобы зафиксировать ошибку по конкретному шаблону и через время не создавать её снова, а увидеть, что она уже существует. Она позволяет привязать данный шаблон к системе учета и отслеживания ошибок (например, в jira). Pg_monitor позволит перейти на указанную для данного шаблона задачу в удобной вам системе по ссылке, которую вы вставите в текстовое поле (обозначенное на рисунке ниже).
После создания задачи на странице «Проблемные запросы» во вкладке «По шаблонам» в строке данного шаблона закрепится значок с задачей, нажав на который тоже можно будет перейти в систему с этой задачей (он также закрепится рядом с идентификационным номером шаблона на странице детализации по этому шаблону и на странице запроса из архива).
При нажатии на этот значок вы увидите модальное окно с конкретными датой поставленной задачи, сроком реализации и ссылкой на неё. Нажав на корзину, можно удалить эту задачу. В окне также будет текстовое поле для вставки ссылки на новую задачу по этому шаблону, если это необходимо. А если кликнуть на знак «+», то можно создать ещё сразу несколько задач, связанных с этим шаблоном.
Вкладка «Контекст»
Вверху вкладки представлена вся детальная информация о запросе из лога базы.
Далее внизу представлена оригинальная форма запроса (написанная серым шрифтом) и более наглядная форма (подсвеченная разными цветами). Этот запрос можно скопировать со всеми его параметрами с помощью значка копирования справа.