Respostas:
Esses dois requisitos não são equivalentes. A versão equivalente do primeiro seria:
SELECT sum(numbackends) FROM pg_stat_database;
Nesse caso, eu esperaria que essa versão fosse um pouco mais rápida que a segunda, simplesmente porque tem menos linhas para contar. Mas você provavelmente não será capaz de medir a diferença.
Ambas as consultas são baseadas exatamente nos mesmos dados, para que sejam igualmente precisas.
A consulta a seguir é muito útil
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;
Definitivamente, eles podem dar resultados diferentes. O melhor é
select count(*) from pg_stat_activity;
É porque inclui conexões com os processos de remetente do WAL que são tratados como conexões regulares e contam para isso max_connections
.
Veja max_wal_senders
O número de conexões TCP o ajudará. Lembre-se de que não é para um banco de dados específico
netstat -a -n | find /c "127.0.0.1:13306"
Observando o código-fonte, parece que a consulta pg_stat_database fornece o número de conexões com o banco de dados atual para todos os usuários. Por outro lado, a consulta pg_stat_activity fornece o número de conexões com o banco de dados atual apenas para o usuário consultante.