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

142

Które z poniższych dwóch jest dokładniejsze?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Murali VP
źródło
4
Lepiej pod względem czego?
Jason Towne

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.

Magnus Hagander
źródło
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;
tbo
źródło
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

gargii
źródło
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;
ďobo
źródło
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"
Sureshkumar Pachamuthu
źródło
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.

Brian L.
źródło
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