Правильный запрос для получения текущего количества соединений в БД PostgreSQL - PullRequest
113 голосов
/ 11 марта 2011

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

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;

Ответы [ 5 ]

178 голосов
/ 11 марта 2011

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

SELECT sum(numbackends) FROM pg_stat_database;

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

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

13 голосов
/ 08 ноября 2018

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

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;
0 голосов
/ 28 июня 2019

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

select count(*) from pg_stat_activity;

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

См. max_wal_senders

0 голосов
/ 18 декабря 2015

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

netstat -a -n | find /c "127.0.0.1:13306"
0 голосов
/ 11 марта 2011

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

...