G.3. pgpro_stats — сбор статистики планирования и выполнения всех обрабатываемых сервером SQL-операторов #

Расширение pgpro_stats предоставляет возможности для сбора статистики планирования и выполнения всех обрабатываемых сервером SQL-операторов. Оно основано на модуле pg_stat_statements и реализует следующую дополнительную функциональность:

  • Сохранение помимо текста запросов соответствующих планов запросов.

  • Возможность изменения частоты сбора статистики для оптимизации связанных с ним издержек.

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

  • Подсчёт статистики использования ресурсов при планировании и выполнении операторов.

  • Подсчёт статистики аннулирования кеша.

  • Вычисление дополнительной статистики архиватора.

  • Предоставление возможности просмотра статистики по очистке баз данных, таблиц и индексов, собранных ядром системы.

  • Трассировка сеансов приложений.

  • Создание представлений, эмулирующих другие расширения.

Описание типов и представлений, отображающих статистику аннулирования кешей, а также общая информация об этой статистике приводится в разделе Подраздел G.3.8.

G.3.1. Ограничения #

  • При некоторых обстоятельствах pgpro_stats может не сопоставить параметры в тексте запроса с теми же параметрами в соответствующем плане запроса.

  • Некоторые запросы SPI в статистике не учитываются.

  • Тексты и планы некоторых запросов SPI не нормализованы.

  • Расширение pgpro_stats несовместимо с pg_stat_statements, а также другими расширениями, встраивающими свои обработчики в анализатор, планировщик или исполнитель и влияющими на разбор, планирование или выполнение запросов. Также обратите внимание, что для получения окончательной версии запросов и планов библиотека pgpro_stats должна указываться последней в списке shared_preload_libraries, но есть расширения, например, pg_pathman, которые работают, только если их библиотека указана последней.

  • pgpro_stats может не работать корректно со сторонними расширениями, добавляющими в планы узлы CustomScan и ForeignScan.

G.3.2. Установка и подготовка #

Расширение pgpro_stats поставляется вместе с Postgres Pro Enterprise в виде отдельного пакета pgpro-stats-ent-16 (подробные инструкции по установке представлены в Главе 17). Установив pgpro_stats, выполните следующие действия, чтобы подготовить pgpro_stats к работе:

  1. Добавьте pgpro_stats в параметр shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'pgpro_stats'
  2. Перезапустите Postgres Pro Enterprise, чтобы изменения вступили в силу.

    Когда сервер перезапустится, pgpro_stats начнёт собирать статистику по всем базам данных в кластере. При необходимости вы можете изменять область сбора или отключить его, воспользовавшись параметрами конфигурации pgpro_stats.

  3. Обращаться к собираемой статистике вы сможете после того, как создадите расширение pgpro_stats:

    CREATE EXTENSION pgpro_stats;

Кроме того, необходимо включить вычисление идентификатора запроса, чтобы расширение pgpro_stats было активно. Это происходит автоматически, если для compute_query_id задано значение auto или on, или загружен любой сторонний модуль, вычисляющий идентификаторы запросов.

G.3.3. Использование #

G.3.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

G.3.3.2. Сбор дополнительных метрик #

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

Чтобы настроить сбор дополнительной метрики, выполните следующее:

  1. Для каждой метрики необходимо определить все параметры конфигурации, перечисленные в Подразделе G.3.7.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'
  2. Перезапустите сервер.

    pgpro_stats начинает собирать статистику по выполняемым операторам и сохраняет её в кольцевом буфере; собранная статистика появляется в представлении pgpro_stats_metrics:

    SELECT * FROM pgpro_stats_metrics;

    Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации postgresql.conf.

  3. При необходимости настройте экспорт данных в систему мониторинга, которую вы используете.

G.3.4. Представления #

G.3.4.1. Представление pgpro_stats_statements #

Статистика, собираемая модулем, выдаётся через представление с именем pgpro_stats_statements. Это представление содержит отдельные строки для каждой комбинации идентификатора базы данных, идентификатора пользователя и идентификатора запроса (но в количестве, не превышающем максимальное число различных операторов, которые может отслеживать модуль). Столбцы представления показаны в Таблице G.65.

Таблица G.65. Столбцы pgpro_stats_statements

ИмяТипСсылкиОписание
useridoidpg_authid.oidOID пользователя, выполнявшего оператор
dbidoidpg_database.oidOID базы данных, в которой выполнялся оператор
toplevelbool True, если данный запрос выполнялся на верхнем уровне (всегда true, если для параметра pgpro_stats.track задано значение top)
queryidbigint Внутренний хеш-код, вычисленный для дерева разбора оператора
planidbigint Внутренний хеш-код, вычисленный для дерева плана оператора
querytext Текст, представляющий оператор
plantext План запроса, представленный в формате, определённом параметром конфигурации pgpro_stats.plan_format
plansint8 Число операций планирования этого оператора (если включён параметр pgpro_stats.track_planning, иначе 0)
total_plan_timefloat8 Общее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning, иначе 0)
min_plan_timefloat8 Минимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning, иначе 0)
max_plan_timefloat8 Максимальное время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning, иначе 0)
mean_plan_timefloat8 Среднее время, затраченное на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning, иначе 0)
stddev_plan_timefloat8 Стандартное отклонение времени, затраченного на планирование этого оператора в миллисекундах (если включён параметр pgpro_stats.track_planning, иначе 0)
plan_rusagepgpro_stats_rusage Статистика использования ресурсов при планировании оператора.
callsint8 Счётчик выполнений данного оператора
total_exec_timefloat8 Общее время, затраченное на выполнение оператора, в миллисекундах
min_exec_timefloat8 Минимальное время, потраченное на выполнение оператора, в миллисекундах
max_exec_timefloat8 Максимальное время, потраченное на выполнение оператора, в миллисекундах
mean_exec_timefloat8 Среднее время, потраченное на выполнение оператора, в миллисекундах
stddev_exec_timefloat8 Стандартное отклонение времени, затраченного на выполнение оператора, в миллисекундах
exec_rusagepgpro_stats_rusage Статистика использования ресурсов при выполнении оператора.
rowsint8 Общее число строк, полученных или затронутых оператором
shared_blks_hitint8 Общее число попаданий разделяемых блоков в кеш для данного оператора
shared_blks_readint8 Общее число разделяемых блоков, прочитанных данным оператором
shared_blks_dirtiedint8 Общее число разделяемых блоков, «загрязнённых» данным оператором
shared_blks_writtenint8 Общее число разделяемых блоков, записанных данным оператором
local_blks_hitint8 Общее число попаданий локальных блоков в кеш для данного оператора
local_blks_readint8 Общее число локальных блоков, прочитанных данным оператором
local_blks_dirtiedint8 Общее число локальных блоков, «загрязнённых» данным оператором
local_blks_writtenint8 Общее число локальных блоков, записанных данным оператором
temp_blks_readint8 Общее число временных блоков, прочитанных данным оператором
temp_blks_writtenint8 Общее число временных блоков, записанных данным оператором
blk_read_timefloat8 Общее время, затраченное оператором на чтение блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае)
blk_write_timefloat8 Общее время, затраченное оператором на запись блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае)
temp_blk_read_timefloat8 Общее время, затраченное оператором на чтение временных блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае). В версиях Postgres Pro ниже 15 всегда содержит ноль.
temp_blk_write_timefloat8 Общее время, затраченное оператором на запись временных блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае). В версиях Postgres Pro ниже 15 всегда содержит ноль.
wal_recordsint8 Общее число записей WAL, сгенерированных при выполнении оператора
wal_fpiint8 Общее число образов полных страниц в WAL, сгенерированных при выполнении оператора
wal_bytesnumeric Общий объём WAL (в байтах), сгенерированный при выполнении оператора
jit_functionsint8 Общее число функций, скомпилированных в JIT-код при выполнении оператора. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_generation_timefloat8 Общее время, затраченное на компиляцию JIT-кода при выполнении оператора, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_inlining_countint8 Количество встраиваний функций, используемых в операторе. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_inlining_timefloat8 Общее время, затраченное на встраивание функций при выполнении оператора, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_optimization_countint8 Количество JIT-оптимизаций для оператора. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_optimization_timefloat8 Общее время, затраченное на JIT-оптимизацию при выполнении оператора, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_emission_countint8 Сколько раз выдавался код при выполнении оператора. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_emission_timefloat8 Общее время, затраченное на выдачу кода при выполнении оператора, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
wait_statsjsonb Объект типа jsonb, содержащий статистику по событиям ожидания для каждого выполнения запроса по соответствующему плану. Все показатели представлены в миллисекундах и кратны параметру конфигурации pgpro_stats.profile_period.
inval_msgspgpro_stats_inval_msgs Число сообщений аннулирования кеша по типам, выданных при выполнении оператора (если это поддерживает сервер, иначе — 0).

Аналогично расширению pg_stat_statements, DML запросы (то есть SELECT, INSERT, UPDATE, DELETE и MERGE) в pgpro_stats объединяются в одну запись, когда они имеют идентичные структуры запросов согласно внутреннему вычисленному хешу. Обычно два запроса будут считаться равными при таком сравнении, если они семантически равнозначны, не считая значений констант, фигурирующих в запросе. Однако служебные команды (то есть все другие команды) сравниваются строго по текстовым строкам запросов. Когда значение константы игнорируется в целях сравнения запроса с другими запросами, эта константа заменяется в выводе pgpro_stats обозначением параметра, например, $k, где k - натуральное число. Если в запросе уже есть параметры, то начальное значение k равно номеру, следующим за номером последнего параметра $n в исходном тексте запроса. Если параметров нет, то начальное значение k равно единице. Стоит отметить, что в некоторых случаях на эту нумерацию могут влиять скрытые символы параметров. Например, PL/pgSQL применяет такие символы для добавления в запросы значений локальных переменных функций, так что оператор PL/pgSQL вида SELECT i + 1 INTO j будет представлен в тексте как SELECT i + $2.

Подобный механизм объединения текстов pgpro_stats использует и для текстов планов. При этом делается попытка сопоставить номера констант в тексте плана соответствующим номерам констант в тексте запроса. Если такая попытка для какой-либо константы в тексте плана оканчивается неудачей, то ей присваивается следующий номер, больший максимального номера заменённой константы в тексте запроса. Например, для запроса:

SELECT 1::int, 'abc'::VARCHAR(3), 2::int;

в его тексте и в тексте соответствующего плана pgpro_stats подставит номера констант следующим образом:

postgres=# SELECT query, plan FROM pgpro_stats_statements;
                     query                      |                                plan
------------------------------------------------+--------------------------------------------------
SELECT $1::int, $2::VARCHAR(3), $3::int         | Result                                           +
                                                |   Output: $1, $4, $3                             +

В данном тексте плана удалось сопоставить константы с номерами 1 и 3 из текста запроса, а константу с номером 2 сопоставить не удалось, и она была заменена номером, следующим за максимальным номером в тексте запроса — номером 4.

При подстановке номеров в тесте плана делается исключение для номера версии XML документа. Если в исходном запросе он был задан константой, например '1.0', то в тексте плана это значение сохранится как есть и не будет заменено на подстановочный символ вида $k. Если в исходном запросе номер версии XML документа был задан выражением, то подстановка символов вместо констант будет сделана по обычным правилам.

G.3.4.2. Представление pgpro_stats_totals #

Агрегированная статистика, собранная модулем, выдаётся через представление pgpro_stats_totals. Это представление содержит отдельные строки для каждого отдельного объекта БД (но в количестве, не превышающем максимальное число различных объектов, которое может отслеживать модуль). Столбцы представления показаны в Таблице G.66.

Таблица G.66. Столбцы pgpro_stats_totals

ИмяТипОписание
object_typetextТип объекта, для которого агрегируется статистика: «cluster» (кластер БД), «database» (база данных), «user» (пользователь), «client_addr» (адрес клиента), «application» (приложение), «backend» (обслуживающий процесс), «session» (сеанс)
object_idbigintИдентификатор объекта: oid для баз и пользователей, pid для обслуживающих процессов, sid для сеансов, NULL для иных объектов
object_nametextТекстовое имя объекта либо NULL
queries_plannedint8Число спланированных запросов
total_plan_timefloat8Общее время, затраченное на планирование операторов, в миллисекундах
total_plan_rusagepgpro_stats_rusageАгрегированная статистика использования ресурсов при планировании операторов
queries_executedint8Число выполненных запросов
total_exec_timefloat8Общее время, затраченное на выполнение операторов, в миллисекундах
total_exec_rusagepgpro_stats_rusageАгрегированная статистика использования ресурсов при выполнении операторов
rowsint8Общее число строк, полученных или затронутых операторами
shared_blks_hitint8Общее число попаданий разделяемых блоков в кеш для данных операторов
shared_blks_readint8Общее число разделяемых блоков, прочитанных операторами
shared_blks_dirtiedint8Общее число разделяемых блоков, «загрязнённых» операторами
shared_blks_writtenint8Общее число разделяемых блоков, записанных операторами
local_blks_hitint8Общее число попаданий локальных блоков в кеш для данных операторов
local_blks_readint8Общее число локальных блоков, прочитанных операторами
local_blks_dirtiedint8Общее число локальных блоков, «загрязнённых» операторами
local_blks_writtenint8Общее число локальных блоков, записанных операторами
temp_blks_readint8Общее число локальных блоков, прочитанных операторами
temp_blks_writtenint8Общее число временных блоков, записанных операторами
blk_read_timefloat8Общее время, затраченное операторами на чтение блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае)
blk_write_timefloat8Общее время, затраченное операторами на запись блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае)
temp_blk_read_timefloat8Общее время, затраченное операторами на чтение временных блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае). В версиях Postgres Pro ниже 15 всегда содержит ноль.
temp_blk_write_timefloat8Общее время, затраченное операторами на запись временных блоков, в миллисекундах (если включён track_io_timing, или ноль в противном случае). В версиях Postgres Pro ниже 15 всегда содержит ноль.
wal_recordsint8Общее число записей WAL, сгенерированных при выполнении операторов
wal_fpiint8Общее число образов полных страниц в WAL, сгенерированных при выполнении операторов
wal_bytesnumericОбщий объём WAL (в байтах), сгенерированный при выполнении операторов
jit_functionsint8Общее число функций, скомпилированных в JIT-код при выполнении операторов. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_generation_timefloat8Общее время, затраченное на компиляцию JIT-кода при выполнении операторов, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_inlining_countint8Количество встраиваний функций, используемых в операторах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_inlining_timefloat8Общее время, затраченное на встраивание функций при выполнении операторов, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_optimization_countint8Количество JIT-оптимизаций для операторов. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_optimization_timefloat8Общее время, затраченное на JIT-оптимизацию при выполнении операторов, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_emission_countint8Сколько раз выдавался код при выполнении операторов. В версиях Postgres Pro ниже 15 всегда содержит ноль.
jit_emission_timefloat8Общее время, затраченное на выдачу кода при выполнении операторов, в миллисекундах. В версиях Postgres Pro ниже 15 всегда содержит ноль.
wait_statsjsonbОбъект типа jsonb, содержащий статистику по событиям ожидания для каждого выполнения запроса. Все показатели представлены в миллисекундах и кратны параметру конфигурации pgpro_stats.profile_period.
inval_msgspgpro_stats_inval_msgsЧисло сообщений аннулирования кеша по типам, выданных при выполнении операторов (если это поддерживает сервер, иначе — 0).
cache_resetsint4Число сбросов разделяемого кеша (только для кластера БД, баз данных и обслуживающих процессов). Увеличивается для обслуживающего процесса, когда он получает сообщение, вызывающее полный сброс кеша.

G.3.4.3. Представление pgpro_stats_metrics #

Метрики, собранные модулем pgpro_stats, выводятся в представлении pgpro_stats_metrics. В таблице ниже описаны столбцы этого представления.

Таблица G.67. Столбцы pgpro_stats_metrics

ИмяТипОписание
metric_numberint4Уникальный идентификатор собираемой метрики, назначаемый пользователем. Этот идентификатор входит в имена параметров, определяющих метрику.
metric_nametextИмя метрики, определённое параметром pgpro_stats.metric_N_name
db_nametextИмя базы данных, для которой была получена метрика
tstimestamptzВремя, когда было вычислено значение метрики
valuejsonbРезультат запроса, производившего вычисление метрики. Он сериализуется в типе jsonb как массив объектов, полученных с помощью функции to_jsonb(строка_результата). В случае ошибки возвращается один объект, содержащий поля code (код ошибки), message (сообщение), detail (подробности) и hint (подсказка).

G.3.4.4. Представление pgpro_stats_archiver #

Представление pgpro_stats_archiver будет содержать одну строку, показывающую данные о процессе архивации кластера.

Таблица G.68. Столбцы pgpro_stat_archiver

СтолбецТипОписание
archived_countbigintЧисло файлов WAL, которые были успешно заархивированы
last_archived_waltextИмя последнего успешно заархивированного файла WAL
last_archived_timetimestamp with time zoneВремя последней успешной архивации
failed_countbigintЧисло неудачных попыток архивации файлов WAL
last_failed_waltextИмя файла WAL, который обрабатывался в ходе последней неудавшейся архивации
last_failed_timetimestamp with time zoneВремя последней неудавшейся архивации
active_timeint8Общее время, в течение которого процесс архивации был активен
archive_command_timeint8Общее время выполнения команды архивации
stats_resettimestamp with time zoneПоследнее время сброса этих статистических данных

G.3.4.5. Представление pgpro_stats_vacuum_database #

Важно

Начиная с Postgres Pro 16, это представление не содержит данных, поскольку отображаемые в нём статистики доступны через представление каталога pg_stats_vacuum_database (за подробностями обратитесь к разделу Системные представления).

Представление pgpro_stats_vacuum_database будет содержать по одной строке для каждой базы данных в текущем кластере, показывая статистику очистки этой конкретной БД. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.

Таблица G.69. Столбцы pgpro_stats_vacuum_database

СтолбецТипОписание
dbidoidOID базы данных
total_blks_readint8Количество блоков базы данных, прочитанных операциями очистки для этой БД
total_blks_hitint8Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этой БД
total_blks_dirtiedint8Количество блоков базы данных, загрязнённых операциями очистки для этой БД
total_blks_writtenint8Количество блоков базы данных, записанных операциями очистки для этой БД
wal_recordsint8Общее число записей WAL, сгенерированных операциями очистки для этой базы данных
wal_fpiint8Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этой базы данных
wal_bytesnumericОбщий объём WAL (в байтах), сгенерированный операциями очистки для этой базы данных
blk_read_timefloat8Общее время, затраченное на чтение блоков базы данных операциями очистки, выполненными для этой БД, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
blk_write_timefloat8Общее время, затраченное на запись блоков базы данных операциями очистки, выполненными для этой БД, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
delay_timefloat8Время простоя в точке задержки при выполнении операций очистки для этой базы данных, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4).
system_timefloat8Время использования процессора в режиме ядра при очистке этой базы данных, в миллисекундах
user_timefloat8Время использования процессора в пользовательском режиме при очистке этой базы данных, в миллисекундах
total_timefloat8Общее время, затраченное на очистку этой базы данных, в миллисекундах
interruptsint4Сколько раз операции очистки для этой базы данных были прерваны из-за каких-либо ошибок

G.3.4.6. Представление pgpro_stats_vacuum_tables #

Важно

Начиная с Postgres Pro 16, это представление не содержит данных, поскольку отображаемые в нём статистики доступны через представление каталога pg_stats_vacuum_tables (за подробностями обратитесь к разделу Системные представления).

Представление pgpro_stats_vacuum_tables будет содержать по одной строке для каждой таблицы в текущей базе данных (включая таблицы TOAST), показывая статистику очистки этой конкретной таблицы. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.

Таблица G.70. Столбцы pgpro_stats_vacuum_tables

СтолбецТипОписание
relidoidOID таблицы
schemanameИмя схемы, в которой расположена эта таблица
relnamenameИмя данной таблицы
total_blks_readint8Количество блоков БД, прочитанных операциями очистки для этой таблицы
total_blks_hitint8Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этой таблицы
total_blks_dirtiedint8Количество блоков базы данных, загрязнённых операциями очистки для этой таблицы
total_blks_writtenint8Количество блоков базы данных, записанных операциями очистки для этой таблицы
rel_blks_readint8Количество блоков, прочитанных из этой таблицы операциями очистки
rel_blks_hitint8Сколько раз блоки этой таблицы уже обнаруживались в буферном кеше операциями очистки, так что чтение с диска не потребовалось (здесь учитываются только случаи обнаружения блоков в кеше Postgres Pro, а не в кеше операционной системы)
pages_scannedint8Количество страниц, к которым обращались операции очистки, выполненные для этой таблицы
pages_removedint8Количество страниц, удалённых из физического хранилища операциями очистки для этой таблицы
pages_frozenint8Сколько раз страницы этой таблицы были помечены операциями очистки в карте видимости как полностью замороженные
pages_all_visibleint8Сколько раз страницы этой таблицы были помечены операциями очистки в карте видимости как полностью видимые
tuples_deletedint8Количество «мёртвых» кортежей, удалённых операциями очистки из этой таблицы
tuples_frozenint8Количество кортежей этой таблицы, помеченных операциями очистки как замороженные
dead_tuplesint8Количество «мёртвых» кортежей, оставленных операциями очистки в этой таблице из-за видимости этих кортежей в транзакциях
index_vacuum_countint8Сколько раз была выполнена очистка индексов этой таблицы
rev_all_frozen_pagesint8Сколько раз для страниц данной таблицы снималась метка полной заморозки в карте видимости
rev_all_visible_pagesint8Сколько раз для страниц данной таблицы снималась метка полной видимости в карте видимости
wal_recordsint8Общее число записей WAL, сгенерированных операциями очистки для этой таблицы
wal_fpiint8Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этой таблицы
wal_bytesnumericОбщий объём WAL (в байтах), сгенерированный операциями очистки для этой таблицы
blk_read_timefloat8Общее время, затраченное на чтение блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
blk_write_timefloat8Общее время, затраченное на запись блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
delay_timefloat8Время простоя в точке задержки при выполнении операций очистки для этой таблицы, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4).
system_timefloat8Время использования процессора в режиме ядра при очистке этой таблицы, в миллисекундах
user_timefloat8Время использования процессора в пользовательском режиме при очистке этой таблицы, в миллисекундах
total_timefloat8Общее время, затраченное на очистку этой таблицы, в миллисекундах
interruptsint4Сколько раз операции очистки для этой таблицы были прерваны из-за каких-либо ошибок

Столбцы total_*, wal_* и blk_* содержат данные об очистке индексов этой таблицы, а столбцы system_time и user_time содержат только данные об очистке кучи.

G.3.4.7. Представление pgpro_stats_vacuum_indexes #

Важно

Начиная с Postgres Pro 16, это представление не содержит данных, поскольку отображаемые в нём статистики доступны через представление каталога pg_stats_vacuum_indexes (за подробностями обратитесь к разделу Системные представления).

Представление pgpro_stats_vacuum_indexes будет содержать одну строку для каждого индекса в текущей базе данных (включая индексы таблицы TOAST), показывая статистику очистки этого конкретного индекса. Эта статистика собирается ядром системы, как описано в Разделе 27.2. В таблице ниже описаны столбцы представления.

Таблица G.71. Столбцы pgpro_stats_vacuum_indexes

СтолбецТипОписание
relidoidOID индекса
schemanameИмя схемы, в которой расположен этот индекс
relnamenameИмя этого индекса
total_blks_readint8Количество блоков БД, прочитанных операциями очистки для этого индекса
total_blks_hitint8Количество попаданий в буферный кеш блоков базы данных в процессе операций очистки, выполненных для этого индекса
total_blks_dirtiedint8Количество блоков базы данных, загрязнённых операциями очистки для этого индекса
total_blks_writtenint8Количество блоков базы данных, записанных операциями очистки для этого индекса
rel_blks_readint8Количество блоков, прочитанных для этого индекса операциями очистки
rel_blks_hitint8Сколько раз блоки этого индекса уже обнаруживались в буферном кеше операциями очистки, так что чтение с диска не потребовалось (здесь учитываются только случаи обнаружения блоков в кеше Postgres Pro, а не в кеше операционной системы ОС)
pages_deletedint8Количество страниц, которые были удалены операциями очистки, выполненными для этого индекса
tuples_deletedint8Количество «мёртвых» кортежей, удалённых операциями очистки для этого индекса
wal_recordsint8Общее число записей WAL, сгенерированных операциями очистки для этого индекса
wal_fpiint8Общее число образов полных страниц в WAL, сгенерированных операциями очистки для этого индекса
wal_bytesnumericОбщий объём WAL (в байтах), сгенерированный операциями очистки для этого индекса
blk_read_timefloat8Общее время, затраченное на чтение блоков БД операциями очистки, выполненными для этого индекса, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
blk_write_timefloat8Общее время, затраченное на запись блоков БД операциями очистки, выполненными для этой таблицы, в миллисекундах (если включён параметр track_io_timing, или ноль в противном случае)
delay_timefloat8Время простоя в точке задержки при выполнении операций очистки для этого индекса, в миллисекундах (за подробностями обратитесь к Подразделу 19.4.4).
system_timefloat8Время использования процессора в режиме ядра при очистке этого индекса, в миллисекундах
user_timefloat8Время использования процессора в пользовательском режиме при очистке этого индекса, в миллисекундах
total_timefloat8Общее время, затраченное на очистку этого индекса, в миллисекундах
interruptsint4Сколько раз операции очистки для этого индекса были прерваны из-за каких-либо ошибок

G.3.5. Типы данных #

G.3.5.1. Тип pgpro_stats_rusage #

Тип pgpro_stats_rusage представляет собой запись, содержащую статистику использования ресурсов во время планирования и выполнения запросов. Поля этого типа показаны в Таблице G.72.

Таблица G.72. Поля pgpro_stats_rusage

ИмяТипОписание
readsbigintКоличество байт, прочитанное на уровне файловой системы
writesbigintКоличество байт, записанное на уровне файловой системы
user_timedouble precisionВремя использования процессора в пользовательском режиме
system_timedouble precisionВремя использования процессора в режиме ядра
minfltsbigintКоличество восстановленных страниц (мягких ошибок обращения к страницам)
majfltsbigintКоличество ошибок обращения к страницам (жёстких)
nswapsbigintКоличество обращений к пространству подкачки
msgsndsbigintКоличество переданных сообщений IPC
msgrcvsbigintКоличество полученных сообщений IPC
nsignalsbigintКоличество полученных сигналов
nvcswsbigintКоличество «добровольных» переключений контекста
nivcswsbigintКоличество принудительных переключений контекста

G.3.6. Функции #

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_vacuum_database, pgpro_stats_vacuum_tables и pgpro_stats_vacuum_indexes собирается ядром системы, для её сброса вызовите функцию pg_stat_reset( ) (за подробностями обратитесь к Подразделу 27.2.28).

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_totals_reset(type text, id bigint) returns void

Функция pgpro_stats_totals_reset очищает всю статистику, собранную к этому времени модулем pgpro_stats для заданного типа (type) и идентификатора (id) объекта. В случае отсутствия параметров или когда параметр type равен 0, очищается вся статистика. Если в параметре type передаётся корректный тип объекта, то в случае указания id очищается статистика только для объекта с заданным идентификатором, а в отсутствие такого указания — для всех объектов заданного типа. Если же параметр type не задаёт существующий тип объекта, никакая статистика не очищается. По умолчанию эту функцию могут выполнять только суперпользователи. Другим пользователям можно дать доступ к ней, используя GRANT.

pgpro_stats_totals() returns setof record

Представление pgpro_stats_totals построено на базе одноимённой функции, которую пользователи также могут вызывать непосредственно.

pgpro_stats_metrics(showtext boolean) returns setof record

Определяет представление pgpro_stats_metrics, описанное подробно в Таблице G.67.

pgpro_stats_wal_sender_crc_errors() returns bigint

Возвращает ноль в Postgres Pro и полноценно работает в Postgres Pro Enterprise.

pgpro_stats_vacuum_tables(dboid oid, relid oid) returns setof record

Определяет строку представления pgpro_stats_vacuum_tables, которое подробно описано в Таблице G.70, для базы данных, указанной в dboid, и таблицы, указанной в reloid. Если reloid = 0, возвращается статистика для каждой таблицы в указанной базе данных.

pgpro_stats_vacuum_indexes(dboid oid, relid oid) returns setof record

Определяет строку представления pgpro_stats_vacuum_indexes, которое подробно описано в Таблице G.71, для базы данных, указанной в dboid, и таблицы, указанной в reloid. Если reloid = 0, возвращается статистика для каждого индекса в указанной базе данных.

G.3.6.1. Функции трассировки сеансов #

В расширении pgpro_stats реализована трассировка сеансов приложений. Она основана на фильтрах, которые запускают протоколирование выполнения запросов, соответствующих условиям фильтрации. Запросы и их планы записываются в так называемые файлы трассировки, указанные пользователем, или в файл системного журнала (если файл трассировки не указан). Фильтры хранятся в таблице, находящейся в общей памяти. Строки этой таблицы являются фильтрами, а столбцы содержат условия фильтрации. Чтобы начать трассировку запросов, следует заполнить эту таблицу фильтрами.

Как только администратор базы данных добавит фильтр в каком-либо сеансе, все последующие выполнения запросов, соответствующих условиям фильтра, будут трассироваться всеми сеансами экземпляра СУБД без необходимости перезапуска сервера. Другими словами, фильтры можно добавлять, удалять или изменять «на лету», и трассировка с этими фильтрами сразу же начнётся для существующих и будущих сеансов.

Каждый фильтр включает:

  • Идентифицирующие поля, такие как username, client_addr, database_name, pid или application_name (за подробностями обратитесь к Таблице G.73). Выполнение оператора будет трассироваться, если его характеристики в текущем сеансе совпадают со значениями соответствующих идентифицирующих полей фильтра.

  • Ресурсные поля, от duration до total_inval_msgs в Таблица G.73. Выполнение оператора будет трассироваться, если ресурсные статистики текущего выполнения оператора превысят пределы, указанные в соответствующих ресурсных полях фильтра.

  • Поля, определяющие параметры EXPLAIN. Они позволяют управлять выводом EXPLAIN в файл трассировки или файл системного журнала.

Предупреждение

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

Специальные функции позволяют создавать, изменять и удалять фильтры запросов:

pgpro_stats_trace_insert(VARIADIC "any") returns integer

Добавляет фильтр в список фильтров трассировки сеансов. Фильтр должен передаваться как последовательность чередующихся пар ключ/значение. Например так:

pgpro_stats_trace_insert('pid', 42, 'database', 'main', 'explain_analyze', true)

Список доступных фильтров указан в Таблице G.73. Значения NULL не допускаются, поэтому пропустите поля, которые могут принимать любые значения. Возвращает идентификатор добавленного фильтра.

pgpro_stats_trace_update(filter_id integer, VARIADIC "any") returns boolean

Изменяет фильтр трассировки сеанса, заданный параметром filter_id. Изменяемые поля фильтра должны быть переданы как последовательность чередующихся пар ключ/значение. Допустимы значения NULL. Список доступных фильтров указан в Таблице G.73. При успешном изменении возвращает true, в противном случае — false.

pgpro_stats_trace_delete(filter_id integer) returns boolean

Удаляет фильтр трассировки сеанса, заданный параметром filter_id. При успешном удалении возвращает true, в противном случае — false.

pgpro_stats_trace_reset() returns integer

Удаляет все фильтры трассировки сеансов. Возвращает количество удалённых фильтров.

pgpro_stats_trace_show() returns setof record

Отображает все фильтры запросов, добавленные пользователем для трассировки. Эти фильтры показаны в Таблице G.73.

Таблица G.73. Вывод функции pgpro_stats_trace_show()

ИмяТипОписание
filter_idintegerИдентификатор фильтра, нумерация от 1.
activebooleanИмеет значение true, если фильтр активен. По умолчанию: true.
aliasnameИмя фильтра
tracefilenameИмя файла трассировки. Файлы трассировки создаются в каталоге PGDATA/pg_stat и имеют расширение trace.
pidintegerИдентификатор обслуживающего процесса, который выполняет определённый оператор
database_namenameИмя базы данных, в которой выполняется определённый оператор
client_addrnameIP-адрес клиента, подключённого к этому обслуживающему процессу
application_namenameИмя приложения, вызвавшего выполнение оператора
usernamenameИмя пользователя, выполняющего оператор
queryidbigintВнутренний хеш-код, вычисленный для дерева разбора оператора
planidbigintВнутренний хеш-код, вычисленный для дерева плана оператора
durationfloat8Время, затраченное на планирование и выполнение оператора, в миллисекундах
plan_timefloat8Время, затраченное на планирование оператора, в миллисекундах
exec_timefloat8Время, затраченное на выполнение оператора, в миллисекундах
user_timefloat8Время использования процессора в пользовательском режиме, затраченное на планирование и выполнение оператора
system_timefloat8Время использования процессора в режиме ядра, затраченное на планирование и выполнение оператора
rowsint8Общее число строк, полученных или затронутых оператором
shared_blks_hitint8Общее число попаданий разделяемых блоков в кеш для данного оператора
shared_blks_readint8Общее число разделяемых блоков, прочитанных данным оператором
shared_blks_fetchedint8Общее число разделяемых блоков, прочитанных данным оператором из буферов
shared_blks_dirtiedint8Общее число разделяемых блоков, «загрязнённых» данным оператором
shared_blks_writtenint8Общее число разделяемых блоков, записанных данным оператором
local_blks_hitint8Общее число попаданий локальных блоков в кеш для данного оператора
local_blks_readint8Общее число локальных блоков, прочитанных данным оператором
local_blks_fetchedint8Общее число локальных блоков, прочитанных данным оператором из буферов
local_blks_dirtiedint8Общее число локальных блоков, «загрязнённых» данным оператором
local_blks_writtenint8Общее число локальных блоков, записанных данным оператором
temp_blks_readint8Общее число временных блоков, прочитанных данным оператором
temp_blks_writtenint8Общее число временных блоков, записанных данным оператором
wal_bytesnumericОбщий объём WAL (в байтах), сгенерированный при выполнении оператора
total_wait_timefloat8Общее время, затраченное на ожидание при выполнении этого оператора
total_inval_msgsbigintОбщее число сообщений аннулирования кеша, выданных при выполнении оператора (если это поддерживает сервер)
explain_analyzebooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром ANALYZE. По умолчанию: false.
explain_verbosebooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром VERBOSE. По умолчанию: false.
explain_costsbooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром COSTS. По умолчанию: true.
explain_settingsbooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром SETTINGS. По умолчанию: false.
explain_buffersbooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром BUFFERS. По умолчанию: false.
explain_walbooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром WAL. По умолчанию: false.
explain_timingbooleanПри значении true вывод EXPLAIN будет протоколироваться с параметром TIMING. По умолчанию: false.
explain_formattextЗначение параметра FORMAT протоколируемой команды EXPLAIN, которое может быть TEXT, XML, JSON или YAML. По умолчанию: TEXT


Пример G.1. Использование функций трассировки сеансов

Добавьте фильтр first:

SELECT pgpro_stats_trace_insert('alias', 'first', 'pid', pg_backend_pid(), 'explain_analyze', true);

Добавьте фильтр second и укажите протоколирование в файл трассировки second_tf.trace:

SELECT pgpro_stats_trace_insert('alias', 'second', 'database_name', current_database(), 'explain_costs', false, 'tracefile', 'second_tf');

Таблицу с фильтрами можно посмотреть следующим образом:

\x auto
SELECT * from pgpro_stats_trace_show();

 -[ RECORD 1 ]-------+----------
 filter_id           | 1
 active              | t
 alias               | first
 tracefile           | 
 pid                 | 243183
 database_name       | 
 client_addr         | 
 application_name    | 
 username            | 
 queryid             | 
 planid              | 
 duration            | 
 plan_time           | 
 exec_time           | 
 user_time           | 
 system_time         | 
 rows                | 
 shared_blks_hit     | 
 shared_blks_read    | 
 shared_blks_fetched | 
 shared_blks_dirtied | 
 shared_blks_written | 
 local_blks_hit      | 
 local_blks_read     | 
 local_blks_fetched  | 
 local_blks_dirtied  | 
 local_blks_written  | 
 temp_blks_read      | 
 temp_blks_written   | 
 wal_bytes           | 
 total_wait_time     | 
 total_inval_msgs    | 
 explain_analyze     | t
 explain_verbose     | f
 explain_costs       | t
 explain_settings    | f
 explain_buffers     | f
 explain_wal         | f
 explain_timing      | t
 explain_format      | text
 -[ RECORD 2 ]-------+----------
 filter_id           | 2
 active              | t
 alias               | second
 tracefile           | second_tf
 pid                 | 
 database_name       | postgres
 client_addr         | 
 application_name    | 
 username            | 
 queryid             | 
 planid              | 
 duration            | 
 plan_time           | 
 exec_time           | 
 user_time           | 
 system_time         | 
 rows                | 
 shared_blks_hit     | 
 shared_blks_read    | 
 shared_blks_fetched | 
 shared_blks_dirtied | 
 shared_blks_written | 
 local_blks_hit      | 
 local_blks_read     | 
 local_blks_fetched  | 
 local_blks_dirtied  | 
 local_blks_written  | 
 temp_blks_read      | 
 temp_blks_written   | 
 wal_bytes           | 
 total_wait_time     | 
 total_inval_msgs    | 
 explain_analyze     | f
 explain_verbose     | f
 explain_costs       | f
 explain_settings    | f
 explain_buffers     | f
 explain_wal         | f
 explain_timing      | f
 explain_format      | text

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

SELECT 1 as result;

Вывод в файл системного журнала выглядит так:

-- :: MSK [] LOG:  Filter 1 triggered explain of the plan:
Query Text: SELECT 1 as result;
Result  (cost=0.00..0.01 rows=1 width=4) (actual time=0.003..0.003 rows=1 loops=1)

Ниже приведён вывод файла трассировки second_tf.trace:

Query Text: SELECT 1 as result;
Result

Удалите первый фильтр:

SELECT pgpro_stats_trace_delete(1);

Также измените значение pid на 2 для второго фильтра

SELECT pgpro_stats_trace_update(2, 'pid', 2);

При выполнении запроса

SELECT 2 as result;

он не записывается в second_tf.trace.

Удалите все фильтры из таблицы:

SELECT pgpro_stats_trace_reset();

G.3.6.2. Функции для создания представлений, эмулирующих другие расширения #

В расширении pgpro_stats предусмотрена возможность создания представлений, аналогичных тем, которые создаются расширениями pg_stat_statements и pg_stat_kcache. Можно создать представления pg_stat_statements, pg_stat_statements_info, pg_stat_kcache и pg_stat_kcache_detail. Каждое представление создаётся в версии Postgres Pro, только если оно доступно в расширении pg_stat_statements/pg_stat_kcache для той же версии Postgres Pro/PostgreSQL. Например, представление pg_stat_statements_info создаётся только в версиях Postgres Pro 14 и выше. Эти представления могут быть созданы следующими функциями:

pgpro_stats_create_pg_stat_statements_compatible_views() returns void

Создаёт представления pg_stat_statements и pg_stat_statements_info.

pgpro_stats_create_pg_stat_kcache_compatible_views() returns void

Создаёт представления pg_stat_kcache и pg_stat_kcache_detail.

Вызывать эти функции могут только суперпользователи.

Для создания представлений pg_stat_statements* необходимо удалить расширение pg_stat_statements, если оно было установлено ранее, и вызвать функцию:

select pgpro_stats_create_pg_stat_statements_compatible_views();

Для создания представлений pg_stat_kcache* необходимо удалить расширение pg_stat_kcache, если оно было установлено ранее, и вызвать функцию:

select pgpro_stats_create_pg_stat_kcache_compatible_views();

После этого с созданными представлениями можно работать так же, как если бы были установлены соответствующие расширения.

Удалить ранее созданные представления можно обычным способом:

drop view pg_stat_statements;
drop view pg_stat_statements_info;
drop view pg_stat_kcache;
drop view pg_stat_kcache_detail;

G.3.7. Параметры конфигурации #

G.3.7.1. Основные параметры #

pgpro_stats.max (integer) #

Параметр pgpro_stats.max задаёт максимальное число операторов, отслеживаемых модулем (то есть максимальное число строк в представлении pgpro_stats_statements). Когда на обработку поступает больше, чем заданное число различных операторов, информация о редко выполняемых операторах отбрасывается. Значение по умолчанию — 5000. Этот параметр можно задать только при запуске сервера.

pgpro_stats.max_totals (integer) #

Параметр pgpro_stats.max_totals задаёт максимальное число объектов, отслеживаемых модулем (то есть максимальное число строк в представлении pgpro_stats_totals). Когда количество наблюдаемых объектов превышает заданное, информация о наименее активно используемых объектах удаляется. Значение по умолчанию — 1000. Этот параметр можно задать только при запуске сервера.

pgpro_stats.track (enum) #

Параметр pgpro_stats.track определяет, какие операторы будут отслеживаться модулем. Со значением top отслеживаются операторы верхнего уровня (те, что непосредственно выполняются клиентами), со значением all также отслеживаются вложенные операторы (например, операторы, вызываемые внутри функций) с уровнем вложенности не более 100, значение 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 определяет, будет ли этот модуль отслеживать операции планирования и их длительность. Включение этого параметра может привести к заметному снижению производительности, особенно когда во множестве одновременных сеансов выполняются операторы с одинаковой структурой запросов, в результате чего эти сеансы пытаются одновременно изменить одни и те же записи в pg_stat_statements. Значение по умолчанию — off (выкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_totals (boolean) #

Параметр pgpro_stats.track_totals определяет, будет ли агрегироваться статистика по объектам (на уровне кластера, баз, пользователей и т. д.). Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_cluster (boolean) #

Параметр pgpro_stats.track_cluster определяет, будет ли агрегироваться статистика по кластеру в целом. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_databases (boolean) #

Параметр pgpro_stats.track_databases определяет, будет ли агрегироваться статистика по базам данных. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_users (boolean) #

Параметр pgpro_stats.track_users определяет, будет ли агрегироваться статистика по пользователям. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_applications (boolean) #

Параметр pgpro_stats.track_applications определяет, будет ли агрегироваться статистика по приложениям (по именам, задаваемым в application_name). Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_client_addr (boolean) #

Параметр pgpro_stats.track_client_addr определяет, будет ли агрегироваться статистика по IP-адресам клиентов. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_backends (boolean) #

Параметр pgpro_stats.track_backends определяет, будет ли агрегироваться статистика по обслуживающим процессам. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

pgpro_stats.track_sessions (boolean) #

Параметр pgpro_stats.track_sessions определяет, будет ли агрегироваться статистика по сеансам. Значение по умолчанию — on (вкл.). Изменить этот параметр могут только суперпользователи.

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. При изменении этого параметра требуется перезапустить сервер.

pgpro_stats.stats_temp_directory (string) #

Параметр pgpro_stats.stats_temp_directory задаёт каталог с внешним файлом для хранения текстов запросов. Это может быть путь от каталога данных или абсолютный путь. При изменении этого параметра требуется перезапустить сервер.

G.3.7.2. Параметры, определяющие метрики #

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

Если вы добавляете параметры для определения новой метрики, необходимо перезапустить сервер, чтобы это определение начало действовать. Когда метрика уже добавлена, её параметры можно изменять без перезапуска сервера, просто перезагружая файл конфигурации postgresql.conf.

pgpro_stats.metric_N_name (text)

Имя метрики с номером N. Это имя будет выводиться в столбце metric_name представления pgpro_stats_metrics.

pgpro_stats.metric_N_query (text)

Текст запроса, определяющий значение собираемой метрики.

pgpro_stats.metric_N_period (integer)

Интервал, с которым будет собираться метрика N, в миллисекундах. Значение по умолчанию: 60000 ms

pgpro_stats.metric_N_db (text)

Список баз данных, в которых будет собираться метрика N. Имена баз данных должны разделяться запятыми. Чтобы выбрать все базы данных в кластере, за исключением баз-шаблонов, можно указать значение *. Если вы также хотите анализировать запросы в базах-шаблонах, их нужно перечислить явно.

pgpro_stats.metric_N_user (text)

Имя пользователя, от имени которого будет собираться метрика N. Этот пользователь должен иметь доступ к базе данных, в которой будет выполняться запрос для сбора метрики.

G.3.8. Метрики аннулирования кеша #

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

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

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

Когда обслуживающий процесс, добавляющий сообщения в очередь, обнаруживает, что размер очереди достиг некоторого предела, он запускает очистку, удаляя сообщения, уже обработанные всеми обслуживающими процессами. Если какие-то обслуживающие процессы не успевают обрабатывать сообщения и, таким образом, задерживают очистку, им передаётся сигнал, чтобы они сбросили свои кеши.

G.3.8.1. Представление pgpro_stats_inval_status #

Представление pgpro_stats_inval_status содержит одну строку, показывающую текущее состояние глобальной очереди аннулирования кеша. Столбцы представления показаны в Таблице G.74.

Таблица G.74. Столбцы pgpro_stats_inval_status

ИмяТипОписание
num_inval_messagesint8Текущее число сообщений аннулирования в очереди
num_inval_queue_cleanupsint8Количество очисток очереди аннулирования, выполненных во избежание её переполнения
num_inval_queue_resetsint4Число операций сброса кеша для обслуживающих процессов, не успевающих обрабатывать сообщения достаточно быстро

В работающей системе num_inval_messages обычно имеет значение около 4000, то есть очередь почти полностью заполнена. Увеличение num_inval_queue_cleanups говорит о том, что в очередь поступает много сообщений аннулирования кеша. Обычно счётчик num_inval_queue_resets не увеличивается, а его увеличение свидетельствует о слишком быстром поступлении таких сообщений или о задержках в их обработке со стороны обслуживающих процессов. Отслеживание значений num_inval_queue_cleanups и num_inval_queue_resets в некоторых случаях может позволить обнаружить проблемные обслуживающие процессы, как описано ниже.

Если на протяжении некоторого времени счётчик num_inval_queue_cleanups заметно увеличивается, а num_inval_queue_resets — нет, это говорит о том, что обслуживающие процессы обрабатывают сообщения аннулирования медленнее, чем они генерируются, но всё же достаточно быстро для того, чтобы очередь не переполнялась.

Если на протяжении некоторого времени счётчик num_inval_queue_cleanups значительно не увеличивается, а счётчик num_inval_queue_resets — увеличивается, это определённо указывает на задержку обработки сообщений обслуживающими процессами. Какие именно обслуживающие процессы виноваты в задержке, позволяет определить столбец cache_resets представления pgpro_stats_totals.

Если же на протяжении некоторого времени оба счётчика значительно увеличиваются, это указывает на то, что обслуживающие процессы обрабатывают сообщения аннулирования настолько медленно, что происходит переполнение очереди. Какие именно процессы задерживают обработку сообщений, позволяет определить столбец cache_reset представления pgpro_stats_total. Что является причиной увеличения значения num_inval_queue_resets, большая скорость генерирования сообщений или слишком медленная их обработка, непосредственно определить нельзя. Однако можно проанализировать счётчик total из представления pgpro_stats_inval_msgs. Если в данном интервале времени счётчик изменился примерно на ту же величину, что и в предыдущем интервале той же длительности, увеличение счётчиков определённо вызвано задержками обслуживающих процессов.

G.3.8.2. Тип pgpro_stats_inval_msgs #

Представления pgpro_stats_statements и pgpro_stats_totals для каждого соответствующего объекта показывают запись типа pgpro_stats_inval_msgs со счётчиками сообщений аннулирования кеша. Поля этой записи показаны в Таблице G.75.

Таблица G.75. Поля pgpro_stats_inval_msgs

ИмяТипОписание
totalbigintОбщее число сообщений аннулирования
catcachebigintЧисло сообщений избирательного аннулирования кеша каталога
catalogbigintЧисло сообщений полного аннулирования кеша каталога
relcachebigintЧисло сообщений избирательного аннулирования кеша отношений
relcache_allbigintЧисло сообщений полного аннулирования кеша отношений
smgrbigintЧисло сообщений, вызывающих аннулирование открытых файлов отношений. Увеличивается, когда сообщения попадают в очередь.
relmapbigintЧисло сообщений аннулирования кеша карты отношений. Увеличивается, когда сообщения отправляются в очередь.
snapshotbigintЧисло сообщений аннулирования снимков каталога

G.3.9. Авторы #

Postgres Professional, Москва, Россия