184

Which of the following two is more accurate?

select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;
4

5 回答 5

285

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

SELECT sum(numbackends) FROM pg_stat_database;

在这种情况下,我希望该版本比第二个版本稍快,仅仅是因为它需要计算的行数较少。但是您不太可能能够衡量差异。

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

于 2011-03-11T08:52:34.680 回答
47

以下查询非常有帮助

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;
于 2018-11-08T12:54:24.590 回答
23

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

select count(*) from pg_stat_activity;

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

max_wal_senders

于 2019-06-28T11:17:51.807 回答
7

根据状态聚合所有 postgres 会话(有多少是空闲的,有多少在做某事......)

select state, count(*) from pg_stat_activity  where pid <> pg_backend_pid() group by 1 order by 1;
于 2019-12-31T12:07:12.090 回答
-4

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

于 2011-03-11T02:42:31.137 回答