Requête correcte pour obtenir le nombre actuel de connexions dans une base de données PostgreSQL

142

Lequel des deux suivants est le plus précis?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
Vice-président de Murali
la source
4
Mieux en termes de quoi?
Jason Towne

Réponses:

226

Ces deux exigences ne sont pas équivalentes. La version équivalente de la première serait:

SELECT sum(numbackends) FROM pg_stat_database;

Dans ce cas, je m'attendrais à ce que cette version soit légèrement plus rapide que la seconde, simplement parce qu'elle a moins de lignes à compter. Mais vous ne serez probablement pas en mesure de mesurer une différence.

Les deux requêtes sont basées exactement sur les mêmes données, elles seront donc tout aussi précises.

Magnus Hagander
la source
1
Pas vrai, ils sont tout aussi précis. Voyez ma réponse.
gargii
2
Notez que lorsque l'outil de ligne de commande postgres, PSQL est utilisé pour exécuter cette requête, le nombre total de connexions est le résultat de cette requête - 1 puisque la connexion psql établie est également incluse en tant que connexion
neonidian
25

La requête suivante est très utile

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
la source
2
pouvez-vous expliquer ce que sont les colonnes «used» et «res_for_super»?
pari le
Bonjour, les connexions utilisées sont utilisées, res_for_super est les connexions réservées à l'accès superutilisateur
tbo
12

Ils peuvent certainement donner des résultats différents. Le meilleur est

select count(*) from pg_stat_activity;

C'est parce qu'il inclut des connexions aux processus d'expéditeur WAL qui sont traitées comme des connexions régulières et comptabilisées max_connections.

Voir max_wal_senders

gargii
la source
2

Agrégation de toutes les sessions postgres par statut (combien sont inactives, combien font quelque chose ...)

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

Le nombre de connexions TCP vous aidera. N'oubliez pas que ce n'est pas pour une base de données particulière

netstat -a -n | find /c "127.0.0.1:13306"
Sureshkumar Pachamuthu
la source
1
Ce commentaire concerne un système d'exploitation Windows. Pour Linux, cela pourrait être quelque chose de ce qui suit: lsof -Pni: 5432 | fgrep ">" | fgrep -i établi | wc -l
XXL
3
Ce n'est pas une requête SQL, veuillez ne pas ajouter de bruit à des questions spécifiques.
bugmenot123
-3

En regardant le code source, il semble que la requête pg_stat_database vous donne le nombre de connexions à la base de données actuelle pour tous les utilisateurs. D'autre part, la requête pg_stat_activity donne le nombre de connexions à la base de données courante pour l'utilisateur qui interroge uniquement.

Brian L
la source
1
C'est incorrect. pg_stat_activity donne également toutes les connexions, quel que soit l'utilisateur. Il vous donne ensuite un champ qui indique de quel utilisateur il s'agit, sur lequel vous pouvez filtrer si vous le souhaitez. Il ne vous donnera pas le texte de la requête si vous n'êtes ni le même utilisateur ni un superutilisateur, mais il affichera toujours la connexion.
Magnus Hagander
3
Vous avez raison. Je n'ai pas regardé assez attentivement la définition de la vue. La restriction sur userid est juste pour la jointure avec pg_authid. Mon erreur.
Brian L