Можно ли отслеживать производительность сервера PostgreSQL изнутри функции PL / PGSQL?

Aug 17 2020

Это может показаться экзотическим, но я хотел бы узнать программно, является ли это «хорошим моментом» для выполнения функции PL / PGSQL с тяжелой записью на сервере. Под «хорошим моментом» я подразумеваю размышление о каком-либо прямом или рассчитанном индикаторе уровня нагрузки, уровня параллелизма или любой другой величины сервера PostgreSQL.

Я знаю, что существует ряд расширенных приложений, специализирующихся на отслеживании производительности, например https://www.datadoghq.com. Но мне просто нужен простой внутренний KPI, который изменяет или откладывает выполнение этих процедур с интенсивной записью до «лучшего момента».

Некоторые из этих процедур очищают таблицы, некоторые производят вычисления средних / сумм по миллионам строк, некоторые проверяют удаленные таблицы и т. Д. Они могут ждать минуты или часы «лучшего момента», когда снизится давление одновременного пользователя.

Есть идеи?

Ответы

3 jjanes Aug 16 2020 at 23:56

Вы можете увидеть, сколько других сессий активно, примерно так:

select count(*) from pg_stat_activity where state='active';

Но вы должны быть суперпользователем или иметь роль pg_monitor, иначе состояние будет NULL для сеансов других пользователей. Если вас это беспокоит, вы можете написать функцию с SECURITY DEFINER, чтобы разрешить доступ к этой информации. (Вероятно, вам все равно следует поместить это в отдельную функцию, что означает, что нет причин, по которым это нужно реализовывать в plpgsql, если только это не единственный язык, доступный вам.)

Вы также можете вызывать любые произвольные операции ОС, используя язык pl с соответствующими привилегиями. В том числе из plpgsql , злоупотребляя COPY...FROM PROGRAM.