F.37. pgpro_stats
Расширение pgpro_stats
предоставляет возможности для сбора статистики планирования и выполнения всех обрабатываемых сервером SQL-операторов. Оно основано на модуле pg_stat_statements и реализует следующую дополнительную функциональность:
Сохранение помимо текста запросов соответствующих планов запросов.
Возможность изменения частоты сбора статистики для оптимизации связанных с ним издержек.
Вычисление статистики по событиям ожидания для выполняемых запросов.
F.37.1. Ограничения
При некоторых обстоятельствах
pgpro_stats
может не сопоставить параметры в тексте запроса с теми же параметрами в соответствующем плане запроса.Некоторые запросы SPI в статистике не учитываются.
pgpro_stats
может не работать корректно со сторонними расширениями, которые встраивают свои обработчики в анализатор, планировщик или исполнитель и влияют на разбор, планирование или выполнение запросов. Для получения окончательной версии запросов и планов библиотекаpgpro_stats
должна указываться последней в спискеshared_preload_libraries
, но есть расширения, например,pg_pathman
, которые работают, только если их библиотека указана последней.pgpro_stats
может не работать корректно со сторонними расширениями, добавляющими в планы узлыCustomScan
иForeignScan
.
F.37.2. Установка и подготовка
Расширение pgpro_stats
включено в состав Postgres Pro Standard, но должно устанавливаться отдельно. Установив pgpro_stats
, выполните следующие действия, чтобы подготовить pgpro_stats
к работе:
Добавьте
pgpro_stats
в параметр shared_preload_libraries в файлеpostgresql.conf
:shared_preload_libraries = 'pgpro_stats'
Перезапустите Postgres Pro Standard, чтобы изменения вступили в силу.
Когда сервер перезапустится,
pgpro_stats
начнёт собирать статистику по всем базам данных в кластере. При необходимости вы можете ограничить область сбора отдельными базами или отключить его, воспользовавшись параметрами конфигурацииpgpro_stats
.Обращаться к собираемой статистики вы сможете после того, как создадите расширение
pgpro_stats
:CREATE EXTENSION pgpro_stats;
F.37.3. Использование
F.37.3.1. Сбор статистики по операторам запросов и планам
После того как расширение pgpro_stats
будет установлено, оно начнёт собирать статистику по выполняемым операторам. Собираемые данные во многом пересекаются с теми, что собирает pg_stat_statements, но также включают информацию о планах запросов и событиях ожидания для каждого типа запроса. Полученная статистика сохраняется в кольцевом буфере в памяти, а прочитать её можно через представление pgpro_stats_statements.
По умолчанию pgpro_stats
собирает статистику по всем операторам, с учётом значений параметров pgpro_stats.track и pgpro_stats.track_utility. Однако в целях оптимизации производительности вы можете уменьшить частоту выборки, воспользовавшись параметром pgpro_stats.query_sample_rate, и тогда pgpro_stats
для вычисления статистики будет случайным образом выбирать заданную долю запросов из общего количества.
Для сбора статистики по событиям ожидания pgpro_stats
производит выборки с определённой периодичностью. Эта периодичность задаётся параметром pgpro_stats.profile_period и по умолчанию равна 10 мс. Если выборка показывает, что процесс находится в состоянии ожидания, к общей длительности ожидания события добавляется значение pgpro_stats.profile_period. Таким образом, оценка длительности ожидания остаётся корректной даже при изменениях значения pgpro_stats.profile_period. Если вас не интересует статистика по событиям ожидания, сбор этой информации можно отключить, установив для параметра pgpro_stats.enable_profile значение false
.
Показатели pgpro_stats_statements.plans
и pgpro_stats_statements.calls
не обязательно должны совпадать, так как статистика планирования и выполнения обновляется в конце соответствующей фазы и только при успешном завершении этой фазы. Например, если для оператора успешно выполнилось планирование, но во время выполнения произошла ошибка, изменится только статистика планирования. Если же планирование пропускается по причине использования кешированного плана, увеличивается только счётчик выполнения.
Например, давайте создадим таблицу со случайными данными и построим в ней индекс:
CREATE TABLE test AS (SELECT i, random() x FROM generate_series(1,1000000) i); CREATE INDEX test_x_idx ON test (x);
Выполните несколько раз следующий запрос с различными значениями :x_min
и :x_max
:
SELECT * FROM test WHERE x >= :x_min AND x <= :x_max;
После этого собранная статистика должна появиться в представлении pgpro_stats_statements
:
SELECT queryid, query, planid, plan, wait_stats FROM pgpro_stats_statements WHERE query LIKE 'select * from test where%'; -[ RECORD 1 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | 8287793242828473388 plan | Gather | Output: i, x | Workers Planned: 2 | -> Parallel Seq Scan on public.test | Output: i, x | Filter: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | {"IO": {"DataFileRead": 10}, "IPC": {"BgWorkerShutdown": 10}, "Total": {"IO": 10, "IPC": 10, "Total": 20}} -[ RECORD 2 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -9045072158333552619 plan | Bitmap Heap Scan on public.test | Output: i, x | Recheck Cond: ((test.x >= $3) AND (test.x <= $4)) | -> Bitmap Index Scan on test_x_idx | Index Cond: ((test.x >= $5) AND (test.x <= $6)) | wait_stats | {"IO": {"DataFileRead": 40}, "Total": {"IO": 40, "Total": 40}} -[ RECORD 3 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -1062789671372193287 plan | Seq Scan on public.test | Output: i, x | Filter: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | NULL -[ RECORD 4 ]---------------------------------------------------------------------------------------------------------- queryid | 1109491335754870054 query | select * from test where x >= $1 and x <= $2 planid | -1748292253893834280 plan | Index Scan using test_x_idx on public.test | Output: i, x | Index Cond: ((test.x >= $3) AND (test.x <= $4)) | wait_stats | NULL
F.37.3.2. Сбор дополнительных метрик
Используя pgpro_stats
, вы можете определить дополнительные интересующие вас метрики. Собираемые данные будут накапливаться в кольцевом буфере для последующей передачи их в систему мониторинга. Этот подход лучше, чем непосредственный опрос базы данных системой мониторинга, так как в случае кратковременного прерывания соединения собранные данные не будут потеряны, а сохранятся в буфере и могут быть считаны позднее.
Чтобы настроить сбор дополнительной метрики, выполните следующее:
Для каждой метрики необходимо определить все параметры конфигурации, перечисленные в Подразделе F.37.6.2. В именах параметров должен присутствовать уникальный идентификатор (номер) метрики.
Например, чтобы раз в 60 секунд собирать информацию о замусоривании индексов, вы можете определить первую дополнительную метрику, установив соответствующие параметры следующим образом:
pgpro_stats.metric_1_name = index_bloat pgpro_stats.metric_1_query = 'select iname, ibloat, ipages from bloat' pgpro_stats.metric_1_db = 'postgres' pgpro_stats.metric_1_user = postgres pgpro_stats.metric_1_period = '60s'
Перезапустите сервер.
pgpro_stats
начинает собирать статистику по выполняемым операторам и сохраняет её в кольцевом буфере; собранная статистика появляется в представленииpgpro_stats_metrics
:SELECT * FROM pgpro_stats_metrics;
Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации
postgresql.conf
.При необходимости настройте экспорт данных в систему мониторинга, которую вы используете.
F.37.4. Представления
F.37.4.1. Представление pgpro_stats_statements
Статистика, собираемая модулем, выдаётся через представление с именем pgpro_stats_statements
. Это представление содержит отдельные строки для каждой комбинации идентификатора базы данных, идентификатора пользователя и идентификатора запроса (но в количестве, не превышающем максимальное число различных операторов, которые может отслеживать модуль). Столбцы представления показаны в Таблице F.63.
Таблица F.63. Столбцы pgpro_stats_statements
Тип столбца Описание |
---|
OID пользователя, выполнявшего оператор |
OID базы данных, в которой выполнялся оператор |
Внутренний хеш-код, вычисленный для дерева разбора оператора |
Внутренний хеш-код, вычисленный для дерева плана оператора |
Текст, представляющий оператор |
План запроса, представленный в формате, определённом параметром конфигурации pgpro_stats.plan_format |
Число операций планирования этого оператора (если включён параметр |
Общее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр |
Минимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр |
Максимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр |
Среднее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр |
Стандартное отклонение времени, затраченного на планирование этого оператора в миллисекундах (если включён параметр |
Счётчик выполнений данного оператора |
Общее время, затраченное на выполнение оператора, в миллисекундах |
Минимальное время, затраченное на выполнение оператора, в миллисекундах |
Максимальное время, затраченное на выполнение оператора, в миллисекундах |
Среднее время, затраченное на выполнение оператора, в миллисекундах |
Стандартное отклонение времени, затраченного на выполнение оператора, в миллисекундах |
Общее число строк, полученных или затронутых оператором |
Общее число попаданий в разделяемый кеш блоков для данного оператора |
Общее число чтений разделяемых блоков для данного оператора |
Общее число разделяемых блоков, «загрязнённых» данным оператором |
Общее число разделяемых блоков, записанных данным оператором |
Общее число попаданий в локальный кеш блоков для данного оператора |
Общее число чтений локальных блоков для данного оператора |
Общее число локальных блоков, «загрязнённых» данным оператором |
Общее число локальных блоков, записанных данным оператором |
Общее число чтений временных блоков для данного оператора |
Общее число записей временных блоков для данного оператора |
Общее время, затраченное оператором на чтение блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) |
Общее время, затраченное оператором на запись блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае) |
Общее число записей WAL, сгенерированных при выполнении оператора |
Общее число образов полных страниц в WAL, сгенерированных при выполнении оператора |
Общий объём WAL (в байтах), сгенерированный при выполнении оператора |
Объект типа |
F.37.4.2. Представление pgpro_stats_metrics
Метрики, собранные модулем pgpro_stats
, выводятся в представлении pgpro_stats_metrics
. В таблице ниже описаны столбцы этого представления.
Таблица F.64. Столбцы pgpro_stats_metrics
Тип столбца Описание |
---|
Уникальный идентификатор собираемой метрики, назначаемый пользователем. Этот идентификатор входит в имена параметров, определяющих метрику. |
Имя метрики, определённое параметром |
Имя базы данных, для которой была получена метрика. |
Время, когда было вычислено значение метрики. |
Результат запроса, производившего вычисление метрики. Он сериализуется в типе |
F.37.5. Функции
-
pgpro_stats_statements_reset(userid Oid, dbid Oid, queryid bigint, planid bigint) returns void
Функция
pgpro_stats_statements_reset
очищает всю статистику, собранную к этому времени модулемpgpro_stats
для заданного пользователя (userid
), базы данных (dbid
), запроса (queryid
) и плана (planid
). В случае отсутствия одного из параметров для него подразумевается нулевое значение (неприменимое ограничение) и очищается статистика, соответствующая другим параметрам. Если никакой параметр не задан или все параметры имеют нулевое значение (неприменимое), очищается вся статистика. По умолчанию эту функцию могут выполнять только суперпользователи. Другим пользователям можно дать доступ к ней, используяGRANT
.-
pgpro_stats_statements(showtext boolean) returns setof record
Представление
pgpro_stats_statements
определяется как результат вызова одноимённой функции. Функциюpgpro_stats_statements
можно также вызывать непосредственно, а с аргументомshowtext := false
можно получить результат без текста запроса (то есть в выходном аргументе, соответствующем столбцу представленияquery
, будет выдаваться null). Эта возможность предусмотрена для того, чтобы внешние средства мониторинга могли не загружать каждый раз текст запросов, который может быть довольно объёмным. Средство мониторинга может просто один раз запомнить текст запросов для каждой записи в представлении (как это и делает сам модульpgpro_stats
) и затем запрашивать текст для новых запросов только при необходимости. Так как сервер сохраняет текст запросов в файле, при таком подходе постоянное чтение содержимогоpgpro_stats_statements
будет создавать меньшую нагрузку на ввод/вывод.-
pgpro_stats_metrics(showtext boolean) returns setof record
Определяет представление
pgpro_stats_metrics
, описанное подробно в Таблице F.64.
F.37.6. Параметры конфигурации
F.37.6.1. Основные параметры
pgpro_stats.max
(integer
)Параметр
pgpro_stats.max
задаёт максимальное число операторов, отслеживаемых модулем (то есть максимальное число строк в представленииpgpro_stats_statements
). Когда на обработку поступает больше, чем заданное число различных операторов, информация о редко выполняемых операторах отбрасывается. Значение по умолчанию — 5000. Этот параметр можно задать только при запуске сервера.pgpro_stats.track
(enum
)Параметр
pgpro_stats.track
определяет, какие операторы будут отслеживаться модулем. Со значениемtop
отслеживаются операторы верхнего уровня (те, что непосредственно выполняются клиентами), со значениемall
также отслеживаются вложенные операторы (например, операторы, вызываемые внутри функций), а значениеnone
полностью отключает сбор статистики по операторам. Значение по умолчанию —top
. Изменять этот параметр могут только суперпользователи.pgpro_stats.track_utility
(boolean
)Параметр
pgpro_stats.track_utility
определяет, будет ли этот модуль отслеживать служебные команды. Служебными командами считаются команды, отличные отSELECT
,INSERT
,UPDATE
иDELETE
. Значение по умолчанию —on
(вкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.track_planning
(boolean
)Параметр
pgpro_stats.track_planning
определяет, будет ли этот модуль отслеживать операции планирования и их длительность. При включении этого параметра возможно заметное снижение производительности, особенно когда параллельно выполняется большое количество практически однотипных запросов. Значение по умолчанию —off
(выкл.). Изменить этот параметр могут только суперпользователи.pgpro_stats.save
(boolean
)Параметр
pgpro_stats.save
определяет, должна ли статистика операторов сохраняться после перезагрузки сервера. Если он отключён (имеет значениеoff
), статистика не сохраняется при остановке сервера и не перезагружается при запуске. Значение по умолчанию —on
(вкл.). Этот параметр можно задать только вpostgresql.conf
или в командной строке сервера.pgpro_stats.plan_format
(text
)Параметр
pgpro_stats.plan_format
выбирает формат плана запроса в выводеEXPLAIN
. Возможные значения:text
,xml
,json
иyaml
. Значение по умолчанию:text
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.enable_profile
(boolean
)Параметр
pgpro_stats.enable_profile
включает профилирование событий ожидания по отдельным операторам. Значение по умолчанию:true
(вкл.). При изменении этого параметра требуется перезапустить сервер.pgpro_stats.query_sample_rate
(float
)Параметр
pgpro_stats.query_sample_rate
задаёт долю запросов, которые будут выбираться случайным образом для подсчёта статистики. Возможные значения лежат в диапазоне от0.0
(пропускать все запросы) до1.0
(обрабатывать все запросы). Значение по умолчанию:1.0
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.profile_period
(integer
)Параметр
pgpro_stats.profile_period
задаёт интервал (в миллисекундах) для сбора информации о событиях ожидания. Значение по умолчанию:10
. Для изменения этого параметра требуются права суперпользователя.pgpro_stats.metrics_buffer_size
(integer
)Параметр
pgpro_stats.metrics_buffer_size
задаёт размер кольцевого буфера для сбора статистических метрик. Значение по умолчанию:16kB
. При изменении этого параметра требуется перезапустить сервер.pgpro_stats.metrics_workers
(integer
)Параметр
pgpro_stats.metrics_workers
задаёт количество рабочих процессов, которые будут собирать статистические метрики. Если этот параметр больше или равен 2, один из рабочих процессов будет главным, распределяющим запросы между всеми остальными. Если количество рабочих процессов ограничивается одним, он будет перезапускаться для подключения к разным базам данных. Когда этот параметр равен0
, сбор метрик отключается. Значение по умолчанию:2
. При изменении этого параметра требуется перезапустить сервер.
F.37.6.2. Параметры, определяющие метрики
Следующие параметры предназначены для определения дополнительных метрик, которые будет собирать pgpro_stats
. Номер N
в имени параметра служит уникальным идентификатором метрики, к которой будет применяться задаваемое значение; он должен быть положительным и уникальным среди всех метрик.
Если вы добавляете параметры для определения новой метрики, необходимо перезапустить сервер, чтобы это определение начало действовать. Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации postgresql.conf
.
pgpro_stats.metric_
(N
_nametext
)Имя метрики с номером
N
. Это имя будет выводиться в столбцеmetric_name
представленияpgpro_stats_metrics
.pgpro_stats.metric_
(N
_querytext
)Текст запроса, определяющий значение собираемой метрики.
pgpro_stats.metric_
(N
_periodinteger
)Интервал, с которым будет собираться метрика
N
, в миллисекундах. Значение по умолчанию: 60000 mspgpro_stats.metric_
(N
_dbtext
)Список баз данных, в которых будет собираться метрика
N
. Имена баз данных должны разделяться запятыми. Чтобы выбрать все базы данных в кластере, за исключением баз-шаблонов, можно указать значение*
. Если вы также хотите анализировать запросы в базах-шаблонах, их нужно перечислить явно.pgpro_stats.metric_
(N
_usertext
)Имя пользователя, от имени которого будет собираться метрика
N
. Этот пользователь должен иметь доступ к базе данных, в которой будет выполняться запрос для сбора метрики.
F.37.7. Авторы
Postgres Professional, Москва, Россия