由 John Doe 六月 19, 2025
你有没有注意到有些 PostgreSQL 的慢查询中带有变量?这些查询能直接用 EXPLAIN 命令进行分析吗?
特性提交日志
为 EXPLAIN 命令添加 GENERIC_PLAN 选项。
这一特性提供了一种非常简便的方式,来查看参数化查询的通用执行计划。若没有该选项,则需要定义预备语句并临时修改计划缓存模式,操作较为繁琐。
需要说明的是,当使用 GENERIC_PLAN 选项时,我们会禁用执行时的分区剪枝功能,这可能属于一种临时性处理方式。原因在于分区剪枝逻辑可能会尝试获取参数值,而这在通用计划场景下会导致失败。
讨论:https://postgr.es/m/0a29b954b10b57f0d135fe12aa0909bd41883eb0.camel@cybertec.at
示例
本次提交的功能是提供一个选项,用于显示语句的通用计划。如果您还不了解通用计划的概念,可以先阅读 PostgreSQL 中的通用计划和定制计划。
在 psql 中查询 EXPLAIN 的帮助信息,将会显示出新的选项:
postgres=# \h explain
命令: EXPLAIN
描述: 显示一个语句的执行计划
语法:
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
其中的 option 可以为如下之一:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
SETTINGS [ boolean ]
GENERIC_PLAN [ boolean ]
BUFFERS [ boolean ]
WAL [ boolean ]
TIMING [ boolean ]
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
让我们创建一些示例数据来进行测试:
CREATE TABLE t1 ( a int, b text );
INSERT INTO t1 SELECT i, i::text FROM generate_series(1,1000000) i;
ANALYZE t1;
在之前的 PostgreSQL 版本中,要查看通用计划,我们需要创建一个预备语句,然后执行 6 次,或者将 plan_cache_mode 切换为 “force_generic_plan”。从新的 PostgreSQL 版本开始,我们可以像这样简单地操作:
EXPLAIN (generic_plan true) SELECT b FROM t1 WHERE a = $1;
QUERY PLAN
---------------------------------------------------------------------
Gather (cost=1000.00..11613.43 rows=1 width=6)
Workers Planned: 2
-> Parallel Seq Scan on t1 (cost=0.00..10613.33 rows=1 width=6)
Filter: (a = $1)
(4 rows)
如果您想查看通用计划,这可以节省一些工作。
非常不错的新特性,感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/3c05284d83b230728e59a25e828992037ef77096