pg_regresql
用 pg_class 统计信息替代物理文件大小参与查询规划
仓库
boringsql/regresql
https://github.com/boringsql/regresql
源码
pg_regresql-2.0.0.tar.gz
pg_regresql-2.0.0.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_regresql | 2.0.0 | LANG | BSD-2-Clause | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3230 | pg_regresql | 否 | 是 | 是 | 是 | 否 | 是 | - |
| 相关扩展 | pg_hint_plan hypopg plan_filter auto_explain |
|---|
Activate it with LOAD pg_regresql or session_preload_libraries.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 2.0.0 | 1817161514 | pg_regresql | - |
| RPM | PIGSTY | 2.0.0 | 1817161514 | pg_regresql_$v | - |
| DEB | PIGSTY | 2.0.0 | 1817161514 | postgresql-$v-pg-regresql | - |
构建
您可以使用 pig build 命令构建 pg_regresql 扩展的 RPM / DEB 包:
pig build pkg pg_regresql # 构建 RPM / DEB 包
安装
您可以直接安装 pg_regresql 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 README,control file,portable 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.relpagesrel->tuples来自pg_class.reltuplesrel->allvisfrac来自pg_class.relallvisible / relpagesIndexOptInfo->pages来自索引的pg_class.relpagesIndexOptInfo->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+。