正确查询以获取 PostgreSQL 数据库中的当前连接数
Posted
技术标签:
【中文标题】正确查询以获取 PostgreSQL 数据库中的当前连接数【英文标题】:Right query to get the current number of connections in a PostgreSQL DB 【发布时间】:2011-07-13 04:02:34 【问题描述】:以下两个哪个更准确?
select numbackends from pg_stat_database;
select count(*) from pg_stat_activity;
【问题讨论】:
在什么方面更好? 【参考方案1】:从查看源代码来看,pg_stat_database 查询似乎为您提供了所有用户与当前数据库的连接数。另一方面,pg_stat_activity 查询只为查询用户提供到当前数据库的连接数。
【讨论】:
这是不正确的。 pg_stat_activity 也提供所有连接,无论用户如何。然后它会为您提供一个字段,说明它是哪个用户,您可以根据需要对其进行过滤。如果您不是同一用户或超级用户,它不会为您提供查询文本,但它仍会显示连接。 你是对的。我没有仔细查看视图定义。对 userid 的限制只是针对 pg_authid 的加入。我的错。【参考方案2】:这两个要求是不等价的。第一个的等效版本是:
SELECT sum(numbackends) FROM pg_stat_database;
在这种情况下,我希望该版本比第二个版本稍快,因为它需要计算的行数较少。但是您不太可能能够衡量差异。
两个查询都基于完全相同的数据,因此它们将同样准确。
【讨论】:
不正确,它们同样准确。看我的回答。 注意,当使用postgres命令行工具,PSQL执行这个查询时,总连接数就是这个查询的结果-1,因为建立的psql连接也算作一个连接 这两个函数可能从同一个数据集中提取,但并不总是返回与您编写它们相同的值。当我查询时,有空数据库连接,每个连接的计数不同。这可以得到相同的答案SELECT sum(numbackends) FROM pg_stat_database WHERE datname is not null;
SELECT count(*) FROM pg_stat_activity WHERE datname is not null;
【参考方案3】:
下面的查询很有帮助
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;
【讨论】:
你能解释一下'used'和'res_for_super'列是什么吗? 您好,used 是使用的连接,res_for_super 是为超级用户访问保留的连接 这个很好,一眼就可以看出目前有多少被使用,有多少是为超级用户连接保留的(即想一想所有连接都被有意或无意消耗的场景,然后剩下 3 个供管理员连接并杀死一些不必要的/有问题的),以及最大可能的连接数。 (根据配置)。【参考方案4】:他们肯定会给出不同的结果。更好的是
select count(*) from pg_stat_activity;
这是因为它包含与 WAL 发送方进程的连接,这些连接被视为常规连接并计入 max_connections
。
见max_wal_senders
【讨论】:
【参考方案5】:按状态聚合所有 postgres 会话(有多少是空闲的,有多少在做某事......)
select state, count(*) from pg_stat_activity where pid <> pg_backend_pid() group by 1 order by 1;
【讨论】:
以上是关于正确查询以获取 PostgreSQL 数据库中的当前连接数的主要内容,如果未能解决你的问题,请参考以下文章
sql 查询以获取PostgreSQL数据库的大小(公共模式)