使用 pg_stat_statements 加入 pg_stat_activity?

问题描述

用户运行大量查询时,我正在研究数据库中的大量负载。我到了 pg_stat_statements,它显示用户的 id、查询以及运行所需的时间。另一方面,我发现 pg_stat_activity 向我显示数据库的活动用户及其 pid, 查询开始, 等等。 我加入了这两个,因为它们在用户 ID 上有相似之处。

SELECT a.usesysid,a.pid,a.client_addr,a.query_start,st.query,st.total_time
FROM pg_stat_activity as a
JOIN pg_stat_statements as st
ON a.usesysid = st.userid

通过这种方式,我可以获取活动用户以及他使用查询的位置,例如其负载等。但问题是当它是与不同 pid 连接的同一用户时, 找到的查询会复制到当时连接的每个用户 pid。

在 pg_stat_activity 中,它显示用户的数据处于活动状态,因此,如果他断开连接,他的数据就会丢失(我用 ETL 解决了这个问题)。 但是处于活动状态,如何防止它们被复制并被用户使用各自的查询

欢迎任何建议或文档。

解决方法

不要加入他们。虽然您可以,但完全不清楚您希望通过这样做实现什么。如果您想知道现在正在加载系统的内容,请使用 pg_stat_activity。如果您想大致了解导致负载随时间平均的原因,请使用 pg_stat_statements。如果您想知道历史上哪些特定查询执行花费了很长时间,请使用 log_min_duration 设置 auto_explain,然后将它们从日志文件中拉出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...