Руководство пользователя ======================== + `Query Monitor`_ + `History`_ + `Query Details`_ Query Monitor ------------- Страница *Query Monitor* отображает доступную для просмотра текущему пользователю **ADCC** информацию о запросах, выполняемых в данный момент времени пользователями **ADB** (:numref:`Рис.%s. `). На странице отображаются выполняющиеся (Running), находящиеся в очереди ожидания исполнения (Queued), а также заблокированные запросы (Blocked). В зависимости от присвоенных прав доступа пользователю доступна отмена выполнения некоторых или всех запросов в списке. .. _query_monitor_overview: .. figure:: ./images/query_monitor_overview.png :align: center Query Monitor Информация о запросах ^^^^^^^^^^^^^^^^^^^^^ Для каждого запроса в списке указывается: * **Query ID** -- уникальный идентификатор запроса, например: ``1590901567-16-2``. Значение является ссылкой на страницу с :ref:`расширенной информацией о запросе `. Идентификатор формируется из значений параметров *tmid*, *ssid* и *ccnt* для каждого запроса: * *tmid* -- временная метка старта кластера; * *ssid* -- id сессии; * *ccnt* -- номер команды в рамках сессии. * **Text** -- первые 20 символов текста запроса. При наведении текст отображается в полном виде; * **Status** -- статус запроса, принимает одно из следующих значений: * *Queued* -- запрос находится в очереди ожидания исполнения; * *Running* -- запрос выполняется; * *Blocked* -- выполнение запроса заблокировано ожиданием получения ресурсной очереди или слота ресурсной группы; блокировкой, вызванной синхронной репликацией или удерживаемой другой транзакцией на объекте базы данных (lock); * *Cancelling* -- отправлен запрос на отмену выполнения. В случае, если статус *Blocked* вызван блокировкой на объекте базы данных, удерживаемой другой транзакцией, нажатие на пиктограмму справа от значения в поле *status* открывает окно с дополнительной информацией (:numref:`Рис.%s. `). В окне содержится перечисление блокирующих запросов, для каждого из которых указывается: * *queryId* -- уникальный идентификатор. Значение параметра *ssid* запроса, выполняющегося в режиме *utility*, равно *-1*. В некоторых случаях, когда невозможно определить номер команды в рамках сессии, параметр *ccnt* содержит значение *X*; * *target* -- информация об объекте, на котором удерживается блокировка; * *segments* -- идентификатор сегмента, на котором удерживается блокировка; * *user* -- пользователь, выполнивший запрос; * *blocked for* -- длительность блокировки. .. _query_monitor_blockers: .. figure:: ./images/query_monitor_blockers.png :align: center :width: 95% Дополнительная информация о блокировке Если выполнение запроса заблокировано по другим причинам, дополнительной информации не предоставляется. * **User** -- пользователь ADB, выполнивший запрос; * **Database** -- название базы данных, в которой был выполнен запрос; * **Workload** -- название ресурсной группы или ресурсной очереди, управляющей данным запросом; * **Submitted** -- время создания запроса; * **Queued time** -- длительность нахождения запроса в очереди ожидания исполнения; * **Run time** -- длительность исполнения запроса. Отмена выполнения запроса ^^^^^^^^^^^^^^^^^^^^^^^^^ **ADCC** предоставляет возможность отмены запросов, выполняющихся в кластере **ADB**. Для отмены одного или нескольких запросов необходимо (:numref:`Рис.%s. `): #. Выбрать при помощи чекбоксов в начале строк таблицы все необходимые запросы (выбор доступен только для запросов, отмена которых разрешена, исходя из прав доступа, определенных для пользователю); #. Выбрать способ отмены запроса и нажать соответствующую кнопку справа над таблицей: * *Cancel* -- отмена выполнения запроса путем вызова функции ``pg_cancel_backend``, отменяющей запрос в обслуживающем процессе; * *Terminate* -- отмена выполнения запроса путем вызова функции ``pg_terminate_backend``, завершающей обслуживающий процесс, в котором выполняется запрос. .. _query_monitor_kill: .. figure:: ./images/query_monitor_kill.png :align: center Выбор запроса для отмены выполнения History ------- На странице *History* можно получить информацию о запросах, выполнявшихся в кластере **ADB** в заданный период времени (:numref:`Рис.%s. `). .. _history_overview: .. figure:: ./images/history_overview.png :align: center Query History Панель фильтров, позволяющая ограничивать вывод истории запросов, открывается при нажатии на иконку в правом верхнем углу экрана. Доступны следующие опции (:numref:`Рис.%s. `): * Ограничение периода времени, в который был создан запрос, по дате (:numref:`Рис.%s. `) и времени (:numref:`Рис.%s. `); * Подстрока, которая должна содержаться в тексте запроса. .. _history_filter: .. figure:: ./images/history_filter.png :align: center Панель фильтров для истории запросов .. _filter_date: .. figure:: ./images/filter_date.png :width: 39% Установка даты начала/конца периода .. _filter_time: .. figure:: ./images/filter_time.png :width: 39% Установка времени начала/конца периода Для каждого запроса в списке указывается: * **Query ID** -- уникальный идентификатор запроса, например: ``1590901567-16-2``. Значение поля является ссылкой на страницу с :ref:`расширенной информацией о запросе `. Идентификатор формируется из значений параметров *tmid*, *ssid* и *ccnt* для каждого запроса: * *tmid* -- временная метка старта кластера; * *ssid* -- id сессии; * *ccnt* -- номер команды в рамках сессии. * **Text** -- первые 20 символов текста запроса. При наведении текст отображается в полном виде; * **Status** -- итоговый статус запроса, принимает одно из следующих значений: * *Done* -- запрос успешно выполнен; * *Cancelled* -- выполнение запроса отменено; * *Error* -- во время исполнения запроса произошла ошибка. * **User** -- пользователь ADB, выполнивший запрос; * **Database** -- название базы данных, в которой был выполнен запрос; * **Submitted** -- время создания запроса; * **Queued time** -- длительность нахождения запроса в очереди ожидания исполнения; * **Run time** -- длительность исполнения запроса; * **Ended** -- время завершения исполнения запроса: как в результате успешного выполнения, так и в следствие ошибки или отмены выполнения. .. _query_details: Query Details ------------- Страница *Query Details* содержит расширенную информацию о выполняющемся запросе или об одном из запросов истории (:numref:`Рис.%s. `). .. _query_details_overview: .. figure:: ./images/query_details_overview.png :align: center Query Details - выполняющийся запрос Информация о запросе ^^^^^^^^^^^^^^^^^^^^ В верхней части страницы отображается текущий статус и длительность исполнения запроса, а также следующая информация: Details """"""" * **User** -- пользователь ADB, выполнивший запрос; * **Database** -- название базы данных, в которой выполнен запрос; * **Workload** -- название ресурсной группы или ресурсной очереди, управляющей данным запросом; * **Planner** -- планировщик запросов, используемый для данного запроса: Legacy или GPORCA; * **Queued Time** -- длительность нахождения запроса в очереди ожидания исполнения; * **Submitted** -- время создания запроса; * **Run Time** -- длительность исполнения запроса; * **Est. progress** -- оценка прогресса выполнения запроса в процентах. Значение рассчитывается на основании оценок стоимости (коэффициента трудоемкости выполнения) и прогресса для каждого узла плана запроса: .. _node_progress: .. figure:: ./images/node_progress.png :align: center :scale: 50 % Где * *NodeProgress* -- прогресс узла; * *ActualRows* -- реальное количество извлеченных строк (кортежей); * *EstimatedRows* -- предположение планировщика о количестве строк (кортежей), которое будет извлечено для данного узла. Тогда общий прогресс, рассчитанный на основании суммы оценок для всех узлов плана: .. _overall_progress: .. figure:: ./images/overall_progress.png :align: center :scale: 50 % Где *Est.Cost(x)* -- оценка стоимости узла, сделанная планировщиком. Оценка прогресса не является точной, так как при расчетах во внимание не принимается множество дополнительных факторов, влияющих на процесс исполнения запроса. Performance """"""""""" Содержимое данного блока меняется в зависимости от статуса запроса. Для исполняющегося запроса в блоке отражен единственный параметр: * **Spill Files** -- объем spill-файлов, используемых в данный момент времени. ADB создает spill-файлы, если доступной памяти ОС оказывается недостаточно. Для запроса из истории блок содержит следующую информацию: * **Spill Files (max)** -- максимальный объем используемых spill-файлов, зафиксированный за время выполнения запроса; * **Spill Files (skew)** -- величина, отражающая "перекос" в объеме созданных на сегментах spill-файлов для момента времени, в который наблюдалась величина Spill Files (max). Значение, отличное от нуля, говорит о том, что один из сегментов использовал больший объем spill-файлов, чем остальные. Расчет значения производится следующим образом: .. _spill_files: .. figure:: ./images/spill_files.png :align: center :scale: 80 % .. _query_details_overview_history: .. figure:: ./images/query_details_overview_history.png :align: center Query Details - запрос из истории Query Text """""""""" Текст запроса, отправленный на исполнение пользователем. Locks&Blocks """""""""""" * **Locks** -- количество блокировок на объектах базы данных, полученных данным запросом. При нажатии на значение открывается список всех удерживаемых блокировок с указанием режима и *queryId* блокируемых запросов (:numref:`Рис.%s. `); * **Blocks** -- список идентификаторов всех запросов, блокирующих выполнение данного запроса, с указанием режима блокировки, полученной каждым из них (:numref:`Рис.%s. `). Значение параметра *ssid* уникального идентификатора запроса, выполняющегося в режиме *utility*, равно *-1*. В некоторых случаях, когда невозможно определить номер команды в рамках сессии, параметр *ccnt* содержит значение *X*. .. _query_details_locks: .. figure:: ./images/query_details_locks.png :width: 49% Блокировки, полученные запросом .. _query_details_blocks: .. figure:: ./images/query_details_blocks.png :width: 49% Список запросов, блокирующих выполнение запроса Plan&Progress """"""""""""" Блок содержит графическое представление дерева плана, отражающее динамику выполнения запроса. В каждом узле отображается тип (выполняемая операция) и прогресс выполнения. Значение прогресса, превышающее *100%*, свидетельствует о том, что планировщик сделал неправильное предположение о количестве кортежей, которое должно быть извлечено при выполнении данного узла. При нажатии на узел открывается панель с дополнительной информацией (:numref:`Рис.%s. `): * *Cost* -- коэффициент трудоемкости выполнения узла плана; * *Relation* -- используемая таблица (опционально); * *Row Skew* -- перекос в данных. Разность между единицей и отношением среднего значения к максимальному количеству кортежей, полученных с сегментов; * *Est. Tuples* -- прогнозируемое количество кортежей; * *Actual Tuples* -- реальное количество извлеченных кортежей; * *Operation Keys* -- дополнительные условия, используемые при выполнении некоторых операций (например, *Hash Key*, *Join Filter*, *Merge Key*, *Filter*). Цвет узла указывает на его состояние: * Белый -- проинициализирован, выполнение не начато; * Темно-зеленый -- выполняется; * Светло-зеленый -- выполнение закончено. .. _dynamic_plan: .. figure:: ./images/dynamic_plan.png :align: center Графическое представление дерева плана Textual plan """""""""""" Текстовое представление плана запроса -- результат выполнения команды *Explain*. Кнопка *planchecker* в левом верхнем углу открывает текст запроса в сервисе https://planchecker.arenadata.io/, позволяющем получить детальную информацию о возможных проблемах производительности. Отмена выполнения запроса ^^^^^^^^^^^^^^^^^^^^^^^^^ Исходя из прав доступа, определенных для пользователя, в правом верхнем углу страницы могут быть доступны кнопки, соответствующие двум способам отмены выполнения запроса (:numref:`Рис.%s. `): * *Cancel* -- отмена выполнения запроса путем вызова функции ``pg_cancel_backend``, отменяющей запрос в обслуживающем процессе; * *Terminate* -- отмена выполнения запроса путем вызова функции ``pg_terminate_backend``, завершающей обслуживающий процесс, в котором выполняется запрос. .. _query_details_kill: .. figure:: ./images/query_details_kill.png :align: center :width: 90% Кнопки отмены выполнения запроса