在PostgreSQL数据库中获取当前连接数的正确查询

225
哪一个更准确:以下两者之一?
select numbackends from pg_stat_database;

select count(*) from pg_stat_activity;

6
更好是指在哪方面? - Jason Towne
5个回答

335

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

SELECT sum(numbackends) FROM pg_stat_database;
在这种情况下,我会期望第一个版本要比第二个版本稍微快一些,因为它需要计算的行数更少。但你不太可能测量出差异。 两个查询都基于完全相同的数据,所以它们的准确度是相等的。

2
不是真的它们同样准确。请看我的回答。 - gargii
7
请注意,在使用PostgreSQL命令行工具PSQL执行此查询时,连接总数是此查询的结果减1,因为也包括了建立的psql连接。 - neonidian
这两个函数可能从同一数据集中提取,但并不总是返回与您编写它们时相同的值。当我查询时,有一些空数据库连接在每个函数中被计算为不同。这个命令可以使得它们返回相同的结果: SELECT sum(numbackends) FROM pg_stat_database WHERE datname is not null; SELECT count(*) FROM pg_stat_activity WHERE datname is not null; - blindguy

66

以下查询非常有帮助

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;

2
你能解释一下“used”和“res_for_super”列是什么吗? - bet
你好,used是已使用的连接,res_for_super是为超级用户访问保留的连接。 - tbo
这个看起来很不错,因为您可以一眼看到当前有多少连接被使用,有多少保留给超级用户连接(例如,当所有连接都被有意或无意地消耗完时,管理员还有3个连接可以连接并关闭一些不必要或具有问题的连接),以及最大可能的连接数(根据配置)。 - vadimbog

37

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

select count(*) from pg_stat_activity;

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

参见max_wal_senders


16

按其状态汇总所有Postgres会话(多少个处于空闲状态,多少个正在执行某些操作...)

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

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

2
那是不正确的。pg_stat_activity会给出所有连接,无论用户如何。然后它会给你一个字段,告诉你是哪个用户,如果你想筛选的话可以用这个字段。如果你不是相同的用户或超级用户,它将不会给出查询的文本,但仍会显示连接。 - Magnus Hagander
6
没错,我没有仔细查看视图定义。对userid的限制只是针对pg_authid的关联操作而言。我的错误。 - Brian L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接