Antworten:
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.
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;
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
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"
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.