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


Ответы:


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;

2
Вы можете объяснить, что такое столбцы "used" и "res_for_super"?
ставка

Здравствуйте, используется используемое соединение, res_for_super - это соединения, зарезервированные для доступа суперпользователя
tbo

13

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

select count(*) from pg_stat_activity;

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

См. Max_wal_senders


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.