0

当用户运行繁重的查询时,我正在研究数据库中的繁重负载。我到了 pg_stat_statements,它向我显示了用户的 ID、查询以及运行所需的时间。另一方面,我发现 pg_stat_activity 向我显示了数据库的活动用户及其 pid、query_start 等。我加入了 2,因为它们在用户 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 解决了它)。但是处于活动状态,它如何防止它们被复制并获取用户使用的各自查询?

欢迎任何建议或文件。

4

1 回答 1

3

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

于 2021-07-21T23:20:43.110 回答