Мониторинг производительности с помощью хранилища запросов

Область применения: отдельный сервер Базы данных Azure для PostgreSQL

Внимание

База данных Azure для PostgreSQL — одиночный сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для PostgreSQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для PostgreSQL — гибкий сервер см. в статье "Что происходит с одним сервером База данных Azure для PostgreSQL?".

Компонент "Хранилище запросов" в базе данных Azure для PostgreSQL позволяет отслеживать производительность запросов с течением времени. Хранилище запросов упрощает устранение неполадок, позволяя быстро выявлять самые медленные и ресурсоемкие запросы. Хранилище запросов автоматически ведет журнал запросов и статистики выполнения и сохраняет их для просмотра. Этот компонент разделяет данные по периодам, давая представление о закономерностях использования баз данных. Данные для всех пользователей, баз данных и запросов хранятся в базе данных с именем azure_sys в экземпляре базы данных Azure для PostgreSQL.

Внимание

Не изменяйте базу данных azure_sys или ее схемы. Это приведет к нарушению работы хранилища запросов и связанных функций оценки производительности.

Включение хранилища запросов

Хранилище запросов является дополнительной функцией, поэтому оно не активно на сервере по умолчанию. Хранилище включается или отключается глобально для всех (но не для отдельных) баз данных на данном сервере.

Включение хранилища запросов с помощью портала Azure

  1. Войдите на портал Azure и выберите сервер службы "База данных Azure для PostgreSQL".
  2. В разделе меню Параметры выберите Параметры сервера.
  3. Найдите параметр pg_qs.query_capture_mode.
  4. Установите значение TOP и нажмите Сохранить.

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

  1. Найдите параметр pgms_wait_sampling.query_capture_mode.
  2. Установите значение ALL и нажмите Сохранить.

Кроме того, вы можете установить эти параметры с помощью Azure CLI.

az postgres server configuration set --name pg_qs.query_capture_mode --resource-group myresourcegroup --server mydemoserver --value TOP
az postgres server configuration set --name pgms_wait_sampling.query_capture_mode --resource-group myresourcegroup --server mydemoserver --value ALL

Подождите около 20 минут, пока первый набор данных не сохранится в базе данных azure_sys.

Данные в хранилище запросов

Хранилище запросов включает два хранилища:

  • хранилище статистики времени выполнения для хранения статистических сведений о выполнении запросов;
  • хранилище статистики ожидания для хранения статистических сведений об ожидании.

Распространенные сценарии использования хранилища запросов включают следующие:

  • определение числа выполнений запроса за данный период времени;
  • сравнение среднего времени выполнения запроса за периоды времени для выявления больших расхождений;
  • определение самых медленно выполняющихся запросов за прошедшие X часов;
  • определение основных N запросов, ожидающих ресурсы;
  • понимание характера ожидания для конкретного запроса.

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

Доступ к информации из хранилища запросов

Данные Query Store хранятся в базе данных azure_sys на вашем сервере Postgres.

Следующий запрос возвращает сведения о запросах в хранилище запросов:

SELECT * FROM query_store.qs_view; 

Это запрос статистики ожидания:

SELECT * FROM query_store.pgms_wait_sampling_view;

Поиск запросов ожидания

Типы событий ожидания объединяют разные события ожидания в группы по принципу сходства. Хранилище запросов предоставляет тип события ожидания, имя определенного события ожидания и запрашиваемый запрос. Возможность сопоставлять эти сведения об ожидании со статистикой времени выполнения запроса позволяет получить более глубокое понимание аспектов, влияющих на характеристики производительности запросов.

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

Наблюдение Действие
Ожидания с высоким уровнем блокировки Проверьте текст затронутых запросов и выявите целевые сущности. Найдите в хранилище запросов другие запросы, изменяющие ту же сущность, которые часто выполняются и (или) имеют большую длительность. Найдя такие запросы, рекомендуется изменить логику приложения, чтобы улучшить параллелизм, или использовать менее строгий уровень изоляции.
Ожидания с большим числом операций ввода-вывода буфера Найдите в хранилище запросов запросы с большим числом физических операций чтения. Если они соответствуют запросам с высокими значениями ожидания ввода-вывода, попробуйте ввести индекс для базовой сущности, чтобы задать поиск вместо сканирования. Это позволит свести к минимуму затраты на операции ввода-вывода запросов. Ознакомьтесь с рекомендациями по повышению производительности серверов на портале: возможно, для этого сервера есть рекомендации по индексам, которые позволят оптимизировать запросы.
Ожидания с высокой загрузкой памяти Найдите в хранилище запросов те запросы, которые используют больше всего памяти. Вероятнее всего, эти запросы препятствуют дальнейшей обработке затронутых запросов. Ознакомьтесь с рекомендациями по повышению производительности для сервера на портале: возможно, есть рекомендации по индексам, которые позволят оптимизировать запросы.

Варианты конфигурации

При включении хранилища запросов оно сохраняет данные с 15-минутным периодом агрегирования: не более 500 уникальных запросов на период.

Ниже приведены настраиваемые параметры для хранилища запросов.

Параметр Description По умолч. Диапазон
pg_qs.query_capture_mode Задает, какие инструкции отслеживаются. ничего none, top, all
pg_qs.max_query_text_length Задает максимальную длину запроса, которую можно сохранить. Более длинные запросы будут усечены. 6000 100–10 000
pg_qs.retention_period_in_days Задает период хранения. 7 1–30
pg_qs.track_utility Задает, будут ли отслеживаться команды служебных программ. on on, off

Следующие параметры применяются исключительно к статистике ожидания.

Параметр Description По умолч. Диапазон
pgms_wait_sampling.query_capture_mode Задает, какие инструкции отслеживаются для статистики ожидания. ничего none, all
Pgms_wait_sampling.history_period Задайте частоту (в миллисекундах) выборки событий ожидания. 100 1–600 000

Примечание.

pg_qs.query_capture_mode заменяет pgms_wait_sampling.query_capture_mode. Если параметр pg_qs.query_capture_mode имеет значение NONE, pgms_wait_sampling.query_capture_mode не оказывает влияния.

Используйте портал Azure или Azure CLI, чтобы получить значение для параметра или задать другое значение.

Представления и функции

Просмотр и управление хранилищем запросов осуществляеются с помощью следующих представлений и функций. Любой пользователь с общедоступной ролью PostgreSQL может использовать эти представления для просмотра данных в хранилище запросов. Эти представления доступны только в базе данных azure_sys.

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

query_store.qs_view

Это представление возвращает текстовые данные запроса в хранилище запросов. Для каждого отдельного query_text используется отдельная строка. Данные недоступны через раздел интеллектуального управления производительностью на портале, API или CLI, но их можно найти, подключившись к azure_sys и запросив 'query_store.query_texts_view'.

Имя Тип Ссылки Description
runtime_stats_entry_id bigint Идентификатор из таблицы runtime_stats_entries
user_id. oid pg_authid.oid Идентификатор объекта пользователя, который выполнил инструкцию
db_id oid pg_database.oid Идентификатор объекта базы данных, в которой была выполнена инструкция
query_id bigint Внутренний хэш-код, вычисляемый на основе дерева синтаксического анализа инструкции
query_sql_text Varchar(10000) Текст репрезентативной инструкции. Разные запросы с одной структурой объединяются в кластеры: этот текст — текст для первого запроса в кластере.
plan_id bigint Идентификатор плана, соответствующего этому запросу (пока недоступно)
start_time TIMESTAMP Запросы проходят агрегирование по временным группам — интервал группы составляет 15 минут по умолчанию. Это время начала, соответствующее временной группе для этой записи.
end_time TIMESTAMP Время окончания, соответствующее временной группе для этой записи.
вызывает bigint Число выполнений запроса
total_time double precision Общее время выполнения запроса (в миллисекундах)
min_time double precision Минимальное время выполнения запроса (в миллисекундах)
min_time double precision Максимальное время выполнения запроса (в миллисекундах)
mean_time double precision Среднее время выполнения запроса (в миллисекундах)
stddev_time double precision Стандартное отклонение времени выполнения запроса (в миллисекундах)
строк bigint Общее число строк, полученных или затронутых инструкцией
shared_blks_hit bigint Общее число обращений инструкции к кэшу общего блока
shared_blks_read bigint Общее число операций чтения общего блока, выполненных инструкцией
shared_blks_dirtied bigint Общее число общих блоков, измененных инструкцией
shared_blks_written bigint Общее число общих блоков, записанных инструкцией
local_blks_hit bigint Общее число обращений инструкции к кэшу локального блока
local_blks_read bigint Общее число операций чтения локального блока, выполненных инструкцией
local_blks_dirtied bigint Общее число локальных блоков, измененных инструкцией
local_blks_written bigint Общее число локальных блоков, записанных инструкцией
temp_blks_read bigint Общее число временных блоков, считанных инструкцией
temp_blks_written bigint Общее число временных блоков, записанных инструкцией
blk_read_time double precision Общее время (в миллисекундах), затраченное инструкцией на чтение блоков (если track_io_timing включен, в противном случае ноль)
blk_write_time double precision Общее время (в миллисекундах), затраченное инструкцией на запись блоков (если track_io_timing включен, в противном случае ноль)

query_store.query_texts_view

Это представление возвращает текстовые данные запроса в хранилище запросов. Для каждого отдельного query_text используется отдельная строка.

Имя Тип Description
query_text_id bigint Идентификатор для таблицы query_texts
query_sql_text Varchar(10000) Текст репрезентативной инструкции. Разные запросы с одной структурой объединяются в кластеры: этот текст — текст для первого запроса в кластере.

query_store.pgms_wait_sampling_view

Это представление возвращает текстовые данные запроса в хранилище запросов. Для каждого отдельного query_text используется отдельная строка. Данные недоступны через раздел интеллектуального управления производительностью на портале, API или CLI, но их можно найти, подключившись к azure_sys и запросив 'query_store.query_texts_view'.

Имя Тип Ссылки Description
user_id. oid pg_authid.oid Идентификатор объекта пользователя, который выполнил инструкцию
db_id oid pg_database.oid Идентификатор объекта базы данных, в которой была выполнена инструкция
query_id bigint Внутренний хэш-код, вычисляемый на основе дерева синтаксического анализа инструкции
event_type text Тип события, которого ожидает серверный компонент
события text Имя события ожидания, если серверный компонент сейчас находится в состоянии ожидания
вызывает Целое Число одинаковых записанных событий

Функции

Query_store.qs_reset() returns void

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

Query_store.staging_data_reset() returns void

staging_data_reset удаляет все статистические данные, собранные хранилищем запросов в памяти (то есть данные в памяти, которые еще не были очищены в базе данных). Эту функцию может выполнить только роль администратора сервера.

Azure Monitor

База данных Azure для PostgreSQL интегрирована с диагностическими настройками Azure Monitor. Параметры диагностики позволяют отправлять журналы Postgres в формате JSON в журналы Azure Monitor для аналитики и предупреждений, концентраторы событий для потоковой передачи и хранилище Azure для архивирования.

Внимание

Данная функция диагностики доступна только в ценовых категориях «Общее назначение» и «Оптимизация памяти».

Настройка параметров диагностики

Активировать параметры диагностики для сервера PostgreSQL можно с помощью портала Azure, интерфейса командной строки, REST API или PowerShell. Категории журналов, которые необходимо настроить: QueryStoreRuntimeStatistics и QueryStoreWaitStatistics.

Чтобы включить журналы ресурсов, используя портал Azure, сделайте следующее.

  1. На портале перейдите в раздел «Параметры диагностики» в меню навигации вашего сервера Postgres.
  2. Выберите «Добавить диагностическую настройку».
  3. Назовите этот параметр.
  4. Выберите предпочтительную конечную точку (учетная запись хранения, концентратор событий, аналитика журналов).
  5. Выберите типы журналов QueryStoreRuntimeStatistics и QueryStoreWaitStatistics.
  6. Сохраните вашу настройку.

Чтобы включить данный параметр с помощью PowerShell, CLI или REST API, см. статью о диагностических настройках.

Формат журнала JSON

В нижеприведенных таблицах описаны поля для двух типов журналов. Порядок появления выбранных полей зависит от выбранной конечной точки вывода.

QueryStoreRuntimeStatistics

Поле Description
TimeGenerated [UTC] Метка времени, когда журнал был записан в формате UTC
ResourceId URI ресурса сервера Azure Postgres
Категория QueryStoreRuntimeStatistics
OperationName QueryStoreRuntimeStatisticsEvent
LogicalServerName_s Имя сервера Postgres
runtime_stats_entry_id_s Идентификатор из таблицы runtime_stats_entries
user_id_s Идентификатор объекта пользователя, который выполнил инструкцию
db_id_s Идентификатор объекта базы данных, в которой была выполнена инструкция
query_id_s Внутренний хэш-код, вычисляемый на основе дерева синтаксического анализа инструкции
end_time_s Время окончания, соответствующее временному интервалу для этой записи
calls_s Число выполнений запроса
total_time_s Общее время выполнения запроса (в миллисекундах)
min_time_s Минимальное время выполнения запроса (в миллисекундах)
max_time_s Максимальное время выполнения запроса (в миллисекундах)
mean_time_s Среднее время выполнения запроса (в миллисекундах)
ResourceGroup Группа ресурсов
SubscriptionId Ваш идентификатор подписки
ResourceProvider Microsoft.DBForPostgreSQL
Ресурс Имя сервера Postgres
ResourceType Servers

QueryStoreWaitStatistics

Поле Description
TimeGenerated [UTC] Метка времени, когда журнал был записан в формате UTC
ResourceId URI ресурса сервера Azure Postgres
Категория QueryStoreWaitStatistics
OperationName QueryStoreWaitEvent
user_id_s Идентификатор объекта пользователя, который выполнил инструкцию
db_id_s Идентификатор объекта базы данных, в которой была выполнена инструкция
query_id_s Внутренний хэш-код запроса
calls_s Число одинаковых записанных событий
event_type_s Тип события, которого ожидает серверный компонент
event_s Имя события ожидания, если серверная часть в настоящее время ожидает
start_time_t Время начала события
end_time_s Время окончания события
LogicalServerName_s Имя сервера Postgres
ResourceGroup Группа ресурсов
SubscriptionId Ваш идентификатор подписки
ResourceProvider Microsoft.DBForPostgreSQL
Ресурс Имя сервера Postgres
ResourceType Servers

Известные проблемы и ограничения

  • Если на сервере PostgreSQL настроен параметр default_transaction_read_only, хранилище запросов не может записывать данные.
  • Операции хранилища запросов могут быть прерваны при обнаружении длинных запросов в Юникоде (>= 6000 байт).
  • Реплики чтения реплицируют данные хранилища запросов с первичного сервера. Это означает, что хранилище запросов реплики чтения не предоставляет статистику о запросах, выполняемых в реплике чтения.

Следующие шаги