永远不会完成的查询的日志计划

And*_*rew 6 postgresql performance postgresql-performance

我们在每晚凌晨 2 点的负载中有一个更新,它有两次将 CPU 固定在 100% 并且在几个小时后从未完成。我强烈怀疑这是因为统计数据不准确导致连接中出现嵌套循环。我无法在具有相同硬件规格和 postgres 配置的较低环境中重现它。

我需要证明嵌套循环正在发生,然后才能放入 RFC 来解决问题(例如调整分析和自动真空设置)。我已经设置了 auto_explain 但这似乎只捕获了实际完成的查询的计划。如何为未完成的查询记录计划?

在 SQL Server 中,我可以通过使用 @get_plans=1 运行 sp_whoisactive 来做到这一点。我正在 Postgres 中寻找类似的东西。到目前为止,我唯一的想法是使用 cron 运行 EXPLAINs,但这似乎非常复杂。

dla*_*and 0

老实说,通过 cron 记录长时间运行的查询对我来说确实是最 KISS 的解决方案:

psql -tc "select now() as t, pid, usename, query from pg_stat_activity where state != 'idle'" > /tmp/pg.running.txt
Run Code Online (Sandbox Code Playgroud)

然后,您可以发现在那里停留几个小时的查询并对它们运行 EXPLAIN。