Что из следующих двух более точно?
select numbackends from pg_stat_database;
select count(*) from pg_stat_activity;
Что из следующих двух более точно?
select numbackends from pg_stat_database;
select count(*) from pg_stat_activity;
Ответы:
Эти два требования не эквивалентны. Эквивалентная версия первой:
SELECT sum(numbackends) FROM pg_stat_database;
В этом случае я ожидал бы, что эта версия будет немного быстрее, чем вторая, просто потому, что в ней меньше строк для подсчета. Но вы вряд ли сможете измерить разницу.
Оба запроса основаны на одних и тех же данных, поэтому они будут одинаково точными.
Следующий запрос очень полезен
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;
Они определенно могут дать разные результаты. Лучше
select count(*) from pg_stat_activity;
Это потому, что он включает соединения с процессами отправителя WAL, которые рассматриваются как обычные соединения и учитываются max_connections
.
См. Max_wal_senders
Количество TCP-соединений вам поможет. Помните, что это не для конкретной базы данных
netstat -a -n | find /c "127.0.0.1:13306"
Глядя на исходный код, кажется, что запрос pg_stat_database дает вам количество подключений к текущей базе данных для всех пользователей. С другой стороны, запрос pg_stat_activity дает количество подключений к текущей базе данных только для запрашивающего пользователя.