Правий запит для отримання поточної кількості з'єднань у БД PostgreSQL


Відповіді:


226

Ці дві потреби не є рівнозначними. Еквівалентною версією першої буде:

SELECT sum(numbackends) FROM pg_stat_database;

У такому випадку я б очікував, що ця версія буде трохи швидшою, ніж друга, просто тому, що вона має менше рядків. Але ви, швидше за все, не зможете виміряти різницю.

Обидва запити базуються на абсолютно однакових даних, тому вони будуть однаково точними.


1
Неправда, вони однаково точні. Дивіться мою відповідь.
gargii

2
Зауважте, що коли інструмент командного рядка postgres використовується PSQL для виконання цього запиту, загальна кількість з'єднань є результатом цього запиту - 1, оскільки підключення psql також включається як з'єднання
neonidian

25

Наступний запит дуже корисний

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
Ви можете пояснити, що використовуються стовпці "використано" та "res_for_super"?
ставка

Привіт, використовувані використовуються сполуки, res_for_super є з'єднання зарезервований для доступу суперкористувача
МРП

12

Вони, безумовно, можуть дати різні результати. Краще

select count(*) from pg_stat_activity;

Це тому, що воно включає в себе з'єднання з процесами відправника WAL, які трактуються як звичайні з'єднання і рахуються max_connections.

Дивіться max_wal_senders


2

Агрегація всіх сеансів постгресів за їх статусом (скільки не працює, скільки щось робить ...)

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 встановлено | wc -l
XXL

3
Це не запит SQL, будь ласка, не додайте шуму конкретним питанням.
bugmenot123

-3

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


1
Це неправильно. pg_stat_activity також дає всі з'єднання, незалежно від користувача. Потім воно дає поле, яке говорить, хто це користувач, на яке ви можете фільтрувати, якщо хочете. Він не надасть вам текст запиту, якщо ви не є тим самим користувачем або суперпользователем, але він все одно покаже з'єднання.
Магнус Hagander

3
Ти маєш рацію. Я недостатньо придивився до визначення виду. Обмеження на userid - це лише приєднання до pg_authid. Моя помилка.
Брайан Л
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.