Prawidłowe zapytanie, aby uzyskać aktualną liczbę połączeń w bazie danych PostgreSQL


Odpowiedzi:


226

Te dwa wymagania nie są równoważne. Równoważna wersja pierwszego byłaby:

SELECT sum(numbackends) FROM pg_stat_database;

W takim przypadku spodziewałbym się, że ta wersja będzie nieco szybsza niż druga, po prostu dlatego, że ma mniej wierszy do policzenia. Ale prawdopodobnie nie będziesz w stanie zmierzyć różnicy.

Oba zapytania opierają się na dokładnie tych samych danych, więc będą równie dokładne.


1
Nieprawda, są równie dokładne. Zobacz moją odpowiedź.
gargii

2
Zwróć uwagę, że gdy do wykonania tego zapytania używane jest narzędzie wiersza poleceń postgres, PSQL, wynikiem tego zapytania jest całkowita liczba połączeń - 1, ponieważ nawiązane połączenie psql jest również uwzględniane jako połączenie
neonidian

25

Poniższe zapytanie jest bardzo pomocne

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
czy możesz wyjaśnić, jakie są kolumny „używane” i „res_for_super”?
postaw zakład

Witam, używane są używane połączenia, res_for_super to połączenia zarezerwowane dla dostępu superużytkownika
tbo,

12

Zdecydowanie mogą dać inne rezultaty. Lepszy jest

select count(*) from pg_stat_activity;

Dzieje się tak, ponieważ zawiera połączenia z procesami nadawcy WAL, które są traktowane jako zwykłe połączenia i liczą się do max_connections.

Zobacz max_wal_senders


2

Agregacja wszystkich sesji postgres według ich statusu (ile jest bezczynnych, ile robi coś ...)

select state, count(*) from pg_stat_activity  where pid <> pg_backend_pid() group by 1 order by 1;

0

Liczba połączeń TCP pomoże Ci. Pamiętaj, że nie dotyczy to konkretnej bazy danych

netstat -a -n | find /c "127.0.0.1:13306"

1
Ten komentarz dotyczy systemu operacyjnego opartego na systemie Windows. W przypadku Linuksa może to być coś z następującego: lsof -Pni: 5432 | fgrep ">" | założono fgrep -i | wc -l
XXL

3
To nie jest zapytanie SQL, proszę nie dodawać szumu do konkretnych pytań.
bugmenot123

-3

Patrząc na kod źródłowy, wygląda na to, że zapytanie pg_stat_database podaje liczbę połączeń z bieżącą bazą danych dla wszystkich użytkowników. Z drugiej strony zapytanie pg_stat_activity podaje liczbę połączeń do bieżącej bazy danych tylko dla odpytującego użytkownika.


1
To jest niepoprawne. pg_stat_activity daje również wszystkie połączenia, niezależnie od użytkownika. Następnie daje pole, które mówi, który to użytkownik, i które możesz filtrować, jeśli chcesz. Nie poda Ci tekstu zapytania, jeśli nie jesteś tym samym użytkownikiem ani superużytkownikiem, ale nadal będzie pokazywać połączenie.
Magnus Hagander

3
Masz rację. Nie przyjrzałem się wystarczająco dokładnie definicji widoku. Ograniczenie identyfikatora użytkownika dotyczy tylko sprzężenia z pg_authid. Mój błąd.
Brian L
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.