我定期运行相同的报告查询,并且大部分时间查询在几分钟内完成。然而,它有时会以一种不确定的方式卡住几个小时。当它卡住时,我用 EXPLAIN ANALYZE
重复了相同的查询。 ,但后者很快完成。
为什么会这样?如何获得正在运行的查询的执行计划?
最佳答案
生成执行计划时,PostgreSQL query planner relies heavily on table statistics .统计数据由 ANALYZE 更新命令和 the autovacuum process .
在您的情况下,似乎大多数情况下统计信息都是正确的,但有时它们会过时,从而导致查询计划效率低下。它可能发生在批量行插入或更新之后。
要在查询完成后查看查询计划,请使用 auto_explain模块。例如,以下命令将 session 配置为记录持续超过一小时的所有查询的计划:
LOAD 'auto_explain';
SET auto_explain.log_min_duration = '1h';
SET auto_explain.log_analyze = true;
参数也可以在 postgresql.conf 中设置。必须在查询开始之前加载模块。
如果你想获得一个已经运行的查询的计划,并且不想等待它完成,你可以使用https://github.com/StarfishStorage/explain-running-query提供的外部脚本。 .该脚本基于auto_explain模块。它将 gdb 附加到 PostgreSQL 后端进程,并打印查询计划。
关于sql - PostgreSQL:是否可以打印正在运行的查询的查询计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60592143/