PostgreSQL 数据库中获取当前并发连接数的查询语句

下面两种说法哪一种更准确?

select numbackends from pg_stat_database;


select count(*) from pg_stat_activity;
219707 次浏览

从源代码来看,pg_stat_database查询似乎为您提供了所有用户到当前数据库的连接数。另一方面,pg_stat_activity查询仅为查询用户提供到当前数据库的连接数。

这两个要求是不相等的。第一个问题的等效版本是:

SELECT sum(numbackends) FROM pg_stat_database;

在这种情况下,我希望这个版本比第二个版本稍微快一点,因为它需要计数的行更少。但你不太可能测量出其中的差别。

这两个查询基于完全相同的数据,因此它们将是同样准确的。

下面的查询非常有用

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;

它们肯定会给出不同的结果。更好的是

select count(*) from pg_stat_activity;

这是因为它包含到WAL发送进程的连接,这些连接被视为常规连接,并计入max_connections

看到max_wal_senders

根据状态聚合所有postgres会话(有多少空闲,有多少在做什么…)

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