右查询以获取PostgreSQL数据库中的当前连接数


Answers:


226

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

SELECT sum(numbackends) FROM pg_stat_database;

在那种情况下,我希望该版本比第二个版本稍快,仅是因为它的行数较少。但是您不可能测量出差异。

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


1
这是不正确的,它们同样准确。看我的答案。
gargii

2
请注意,当使用postgres命令行工具PSQL执行该查询时,连接总数是该查询的结果-1,因为建立的psql连接也包括在连接中
neonidian

25

以下查询非常有帮助

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
您能解释一下“已使用”和“ res_for_super”列吗?
下注

您好,使用过的连接已使用,res_for_super是保留供超级用户访问的连接
tbo

12

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

select count(*) from pg_stat_activity;

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

参见max_wal_senders


2

根据状态汇总所有postgres会话(有多少空闲,有多少在做某事...)

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

0

TCP连接数将为您提供帮助。请记住,它不适用于特定的数据库

netstat -a -n | find /c "127.0.0.1:13306"

1
此注释适用于基于Windows的操作系统。对于Linux,可能是以下情况:lsof -Pni:5432 | fgrep“>” | fgrep -i建立了| wc -l
XXL

3
这不是SQL查询,请不要在特定问题上加添噪音。
bugmenot123 '19

-3

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


1
那是不对的。pg_stat_activity也提供所有连接,无论用户如何。然后,它会为您提供一个字段,说明您是哪个用户,您可以根据需要进行过滤。如果您不是同一用户还是超级用户,它将不会为您提供查询文本,但仍会显示连接。
Magnus Hagander

3
你是对的。我对视图定义的关注不够。对userid的限制仅适用于针对pg_authid的连接。我的错。
Brian L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.