问题描述
当用户运行大量查询时,我正在研究数据库中的大量负载。我到了 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,然后将它们从日志文件中拉出。