sql - PostgreSQL:是否可以打印正在运行的查询的查询计划?

标签 sql postgresql sql-execution-plan explain

我定期运行相同的报告查询,并且大部分时间查询在几分钟内完成。然而,它有时会以一种不确定的方式卡住几个小时。当它卡住时,我用 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/

相关文章:

当索引包含 varchar2 列时 Oracle 不使用索引排序 - NLS_SORT

sql - 如果前一个值为空,如何获取倒数第二个值

SQL:如何根据类别进行选择?

mysql - 在同一表中插入或更新另一列时触发更新列

sql - 如何提高聚集索引查找的性能

sql - 缓存 SQL 执行计划

mysql - 如何在 Eloquent 中使用原始选择?

postgresql - 如何获得忽略异常值的平均值?

postgresql - "select abc from (select 1) as abc"产生 "(1)"而不是 "1"

postgresql - 为什么 postgres "scan index(btree)"计划阶段返回所有行?