Правильный запрос для получения текущего количества подключений в БД PostgreSQL

154

Что из следующих двух более точно?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Мурали В.П.
источник
4
Лучше с точки зрения чего?
Джейсон Таун

Ответы:

242

Эти два требования не эквивалентны. Эквивалентная версия первой:

SELECT sum(numbackends) FROM pg_stat_database;

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

Оба запроса основаны на одних и тех же данных, поэтому они будут одинаково точными.

Магнус Хагандер
источник
1
Неправда, они одинаково точны. Смотрите мой ответ.
gargii
2
Обратите внимание, что когда для выполнения этого запроса используется инструмент командной строки postgres, PSQL, общее количество подключений является результатом этого запроса - 1, поскольку созданное подключение psql также включается в качестве подключения
neonidian
28

Следующий запрос очень полезен

select  * from
(select count(*) used from pg_stat_activity) q1,
(select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) q2,
(select setting::int max_conn from pg_settings where name=$$max_connections$$) q3;
tbo
источник
2
Вы можете объяснить, что такое столбцы "used" и "res_for_super"?
ставка
Здравствуйте, используется используемое соединение, res_for_super - это соединения, зарезервированные для доступа суперпользователя
tbo
13

Они определенно могут дать разные результаты. Лучше

select count(*) from pg_stat_activity;

Это потому, что он включает соединения с процессами отправителя WAL, которые рассматриваются как обычные соединения и учитываются max_connections.

См. Max_wal_senders

Gargii
источник
2

Агрегация всех сеансов postgres по их статусу (сколько простаивает, сколько что-то делает ...)

select state, count(*) from pg_stat_activity  where pid <> pg_backend_pid() group by 1 order by 1;
Лобо
источник
0

Количество TCP-соединений вам поможет. Помните, что это не для конкретной базы данных

netstat -a -n | find /c "127.0.0.1:13306"
Сурешкумар Пачамуту
источник
1
Этот комментарий относится к ОС на базе Windows. Для Linux это может быть что-то из следующего: lsof -Pni: 5432 | fgrep ">" | fgrep -i installed | wc -l
XXL
4
Это не SQL-запрос, пожалуйста, не добавляйте шума к конкретным вопросам.
bugmenot123 05
-3

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

Брайан Л
источник
1
Это неверно. pg_stat_activity также предоставляет все подключения, независимо от пользователя. Затем он дает вам поле, в котором указано, какой это пользователь, и вы можете фильтровать его, если хотите. Он не предоставит вам текст запроса, если вы не тот же пользователь или суперпользователь, но он все равно покажет соединение.
Магнус Хагандер,
4
Ты прав. Я недостаточно внимательно посмотрел на определение вида. Ограничение для идентификатора пользователя предназначено только для соединения с pg_authid. Виноват.
Brian L