正确查询以获取 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 数据库中的当前连接数的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql:查询返回不正确的数据

sql 查询以获取PostgreSQL数据库的大小(公共模式)

PostgreSQL:多个存在返回不正确的结果

PostgreSQL 查询性能和可能的优化

如何为复杂的 sql 查询获取中间数据。 PostgreSQL

c#在postgresql数据库中获取正确的数据编码