Richtige Abfrage zum Abrufen der aktuellen Anzahl von Verbindungen in einer PostgreSQL-Datenbank

142

Welche der folgenden beiden ist genauer?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Murali VP
quelle
4
Besser in Bezug auf was?
Jason Towne

Antworten:

226

Diese beiden Anforderungen sind nicht gleichwertig. Die äquivalente Version der ersten wäre:

SELECT sum(numbackends) FROM pg_stat_database;

In diesem Fall würde ich erwarten, dass diese Version etwas schneller als die zweite ist, einfach weil weniger Zeilen zu zählen sind. Aber Sie werden wahrscheinlich keinen Unterschied messen können.

Beide Abfragen basieren auf genau denselben Daten, sodass sie gleich genau sind.

Magnus Hagander
quelle
1
Nicht wahr, sie sind gleich genau. Siehe meine Antwort.
Gargii
2
Beachten Sie, dass, wenn das Postgres-Befehlszeilentool PSQL zum Ausführen dieser Abfrage verwendet wird, die Gesamtzahl der Verbindungen das Ergebnis dieser Abfrage ist - 1, da die hergestellte psql-Verbindung auch als Verbindung enthalten ist
neonidian
25

Die folgende Abfrage ist sehr hilfreich

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
quelle
2
Können Sie erklären, was die Spalten 'used' und 'res_for_super' sind?
Wette
Hallo, verwendet werden verwendet Verbindung, res_for_super ist Verbindungen für Superuser-Zugriff reserviert
tbo
12

Sie können definitiv unterschiedliche Ergebnisse liefern. Der bessere ist

select count(*) from pg_stat_activity;

Dies liegt daran, dass es Verbindungen zu WAL-Absenderprozessen enthält, die als reguläre Verbindungen behandelt werden und dazu zählen max_connections .

Siehe max_wal_senders

gargii
quelle
2

Aggregation aller Postgres-Sitzungen nach ihrem Status (wie viele sind untätig, wie viele tun etwas ...)

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

Die Anzahl der TCP-Verbindungen hilft Ihnen dabei. Denken Sie daran, dass es sich nicht um eine bestimmte Datenbank handelt

netstat -a -n | find /c "127.0.0.1:13306"
Sureshkumar Pachamuthu
quelle
1
Dieser Kommentar gilt für ein Windows-basiertes Betriebssystem. Für Linux könnte dies Folgendes sein: lsof -Pni: 5432 | fgrep ">" | fgrep -i gegründet | wc -l
XXL
3
Dies ist keine SQL-Abfrage. Fügen Sie bestimmten Fragen kein Rauschen hinzu.
Bugmenot123
-3

Aus dem Quellcode geht hervor, dass die Abfrage pg_stat_database die Anzahl der Verbindungen zur aktuellen Datenbank für alle Benutzer angibt. Andererseits gibt die Abfrage pg_stat_activity die Anzahl der Verbindungen zur aktuellen Datenbank nur für den abfragenden Benutzer an.

Brian L.
quelle
1
Das ist falsch pg_stat_activity gibt auch alle Verbindungen an, unabhängig vom Benutzer. Anschließend erhalten Sie ein Feld, in dem angegeben ist, um welchen Benutzer es sich handelt, nach dem Sie filtern können, wenn Sie möchten. Der Text der Abfrage wird nicht angezeigt, wenn Sie nicht derselbe Benutzer oder ein Superuser sind. Die Verbindung wird jedoch weiterhin angezeigt.
Magnus Hagander
3
Du hast recht. Ich habe mir die Ansichtsdefinition nicht genau genug angesehen. Die Einschränkung für Benutzer-ID gilt nur für den Join gegen pg_authid. Mein Fehler.
Brian L