pg_regresql

用 pg_class 统计信息替代物理文件大小参与查询规划

概览

扩展包名版本分类许可证语言
pg_regresql2.0.0LANGBSD-2-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
3230pg_regresql-
相关扩展pg_hint_plan hypopg plan_filter auto_explain

Activate it with LOAD pg_regresql or session_preload_libraries.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.0.01817161514pg_regresql-
RPMPIGSTY2.0.01817161514pg_regresql_$v-
DEBPIGSTY2.0.01817161514postgresql-$v-pg-regresql-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
d12.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
d13.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
d13.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u22.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u22.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u24.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u24.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u26.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
u26.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0

构建

您可以使用 pig build 命令构建 pg_regresql 扩展的 RPM / DEB 包:

pig build pkg pg_regresql         # 构建 RPM / DEB 包

安装

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

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

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

pig install pg_regresql;          # 当前活跃 PG 版本安装
pig ext install -y pg_regresql -v 18  # PG 18
pig ext install -y pg_regresql -v 17  # PG 17
pig ext install -y pg_regresql -v 16  # PG 16
pig ext install -y pg_regresql -v 15  # PG 15
pig ext install -y pg_regresql -v 14  # PG 14
dnf install -y pg_regresql_18       # PG 18
dnf install -y pg_regresql_17       # PG 17
dnf install -y pg_regresql_16       # PG 16
dnf install -y pg_regresql_15       # PG 15
dnf install -y pg_regresql_14       # PG 14
apt install -y postgresql-18-pg-regresql   # PG 18
apt install -y postgresql-17-pg-regresql   # PG 17
apt install -y postgresql-16-pg-regresql   # PG 16
apt install -y postgresql-15-pg-regresql   # PG 15
apt install -y postgresql-14-pg-regresql   # PG 14

预加载配置

shared_preload_libraries = 'pg_regresql';

创建扩展

CREATE EXTENSION pg_regresql;

用法

来源:extension READMEcontrol fileportable stats article

pg_regresql 是 RegreSQL 的 PostgreSQL planner-hook 组件。它让规划器优先信任 pg_class 中的统计信息,而不是根据物理文件大小重新缩放估算值,因此适合在注入生产统计后做执行计划回归测试。

激活 hook

LOAD 'pg_regresql';

EXPLAIN SELECT ...;

如果希望整个测试实例都启用它,上游建议:

session_preload_libraries = 'pg_regresql'

它覆盖的估算

README 说明该 hook 会在 estimate_rel_size() 之后运行,并用 catalog 中的值替换规划器默认估算:

  • rel->pages 来自 pg_class.relpages
  • rel->tuples 来自 pg_class.reltuples
  • rel->allvisfrac 来自 pg_class.relallvisible / relpages
  • IndexOptInfo->pages 来自索引的 pg_class.relpages
  • IndexOptInfo->tuples 来自索引的 pg_class.reltuples

典型工作流

SELECT pg_restore_relation_stats(
    'schemaname', 'public',
    'relname', 'test_orders',
    'relpages', 123513::integer,
    'reltuples', 50000000::real,
    'relallvisible', 123513::integer
);

LOAD 'pg_regresql';

EXPLAIN SELECT * FROM test_orders WHERE created_at > '2024-06-01';

这个流程主要用于在本地复现生产计划,或在 migration、升级和 plan-regression 测试中复用已恢复的生产统计。

说明

  • 控制文件当前声明 default_version = '2.0'
  • 公开仓库里的 tag 仍主要是 v2.0.0-alpha*,因此打包目标 2.0.0 领先于 GitHub 上清晰标注的最终正式 tag。
  • 上游文档说明该扩展支持 PostgreSQL 14+。

最后修改 2026-05-01: update extension data (e399d22)