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