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


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.


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;

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


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;

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"

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.