pg_stat_plans

跟踪查询计划级别的调用次数、执行时间与示例 EXPLAIN 文本。

概览

扩展包名版本分类许可证语言
pg_stat_plans2.1.0STATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
6050pg_stat_plans-
相关扩展pg_stat_statements pg_store_plans pg_show_plans pg_stat_kcache

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.1.01817161514pg_stat_plans-
RPMPGDG2.1.01817161514pg_stat_plans_$v-
DEBPGDG2.1.01817161514postgresql-$v-pg-stat-plans-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PGDG MISSPGDG MISS
el8.aarch64PGDG MISSPGDG MISS
el9.x86_64PGDG MISSPGDG MISS
el9.aarch64PGDG MISSPGDG MISS
el10.x86_64PGDG MISSPGDG MISS
el10.aarch64PGDG MISSPGDG MISS
d12.x86_64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
d12.aarch64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
d13.x86_64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
d13.aarch64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u22.x86_64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u22.aarch64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u24.x86_64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u24.aarch64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u26.x86_64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS
u26.aarch64
PGDG 2.1.0
PGDG 2.1.0
PGDG MISSPGDG MISS

安装

您可以直接安装 pg_stat_plans 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_stat_plans;          # 当前活跃 PG 版本安装
pig ext install -y pg_stat_plans -v 18  # PG 18
pig ext install -y pg_stat_plans -v 17  # PG 17
pig ext install -y pg_stat_plans -v 16  # PG 16
dnf install -y pg_stat_plans_18       # PG 18
dnf install -y pg_stat_plans_17       # PG 17
dnf install -y pg_stat_plans_16       # PG 16
apt install -y postgresql-18-pg-stat-plans   # PG 18
apt install -y postgresql-17-pg-stat-plans   # PG 17
apt install -y postgresql-16-pg-stat-plans   # PG 16

预加载配置

shared_preload_libraries = '$libdir/pg_stat_plans';

创建扩展

CREATE EXTENSION pg_stat_plans;

用法

来源:READMEv2.1.0 releaseSQL objects

pg_stat_plans 用于跟踪 PostgreSQL 执行计划形状的聚合统计。它把计划树哈希为 plan ID,把示例 EXPLAIN 文本存放在共享内存中,并帮助识别同一个 query ID 是否出现了不同计划。

启用

pg_stat_plans 需要 PostgreSQL 16 或更新版本,并且必须在服务器启动时加载:

shared_preload_libraries = 'pg_stat_plans'
pg_stat_plans.compress = 'zstd'
CREATE EXTENSION pg_stat_plans;

通常建议和 pg_stat_statements 一起使用,便于把 plan ID 与查询文本关联起来。

查询计划

SELECT *
FROM pg_stat_plans;

视图包含 useriddbidtoplevelqueryidplanidcallstotal_exec_timeplan。如果只需要统计而不需要计划文本:

SELECT *
FROM pg_stat_plans(false);

queryid 汇总可以查看同一个归一化查询选择过哪些计划形状:

SELECT queryid, planid, calls, total_exec_time / NULLIF(calls, 0) AS avg_exec_time
FROM pg_stat_plans(false)
ORDER BY queryid, avg_exec_time DESC;

运行中查询

在 PostgreSQL 18 及更新版本上,pg_stat_plans_activity 可以显示当前运行中查询的 plan ID 和示例计划:

SELECT *
FROM pg_stat_plans_activity;

重置与配置

SELECT pg_stat_plans_reset();

重要设置包括 pg_stat_plans.maxpg_stat_plans.max_sizepg_stat_plans.max_plan_memorypg_stat_plans.trackpg_stat_plans.compresspg_stat_plans.plan_advice

注意事项

统计基于 PostgreSQL cumulative statistics 系统,因此计数器会在事务结束时刷新,并可能有延迟。Plan ID 描述的是计划形状,分区、类型转换或表达式细节变化都可能导致 plan ID 变化。


最后修改 2026-07-02: extension update 2026-07-02 (d4da20c)