pg_ivm
增量维护的物化视图
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_ivm | 1.14 | FEAT | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 2840 | pg_ivm | 否 | 是 | 是 | 是 | 否 | 否 | pg_catalog |
| 相关扩展 | age hll rum pg_graphql pg_jsonschema jsquery pg_hint_plan |
|---|
deb takeover by pgdg since 2026-01
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 1.14 | 1817161514 | pg_ivm | - |
| RPM | PIGSTY | 1.14 | 1817161514 | pg_ivm_$v | - |
| DEB | PIGSTY | 1.14 | 1817161514 | postgresql-$v-pg-ivm | - |
构建
您可以使用 pig build 命令构建 pg_ivm 扩展的 DEB 包:
pig build pkg pg_ivm # 构建 DEB 包
安装
您可以直接安装 pg_ivm 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install pg_ivm; # 当前活跃 PG 版本安装
pig ext install -y pg_ivm -v 18 # PG 18
pig ext install -y pg_ivm -v 17 # PG 17
pig ext install -y pg_ivm -v 16 # PG 16
pig ext install -y pg_ivm -v 15 # PG 15
pig ext install -y pg_ivm -v 14 # PG 14
dnf install -y pg_ivm_18 # PG 18
dnf install -y pg_ivm_17 # PG 17
dnf install -y pg_ivm_16 # PG 16
dnf install -y pg_ivm_15 # PG 15
dnf install -y pg_ivm_14 # PG 14
apt install -y postgresql-18-pg-ivm # PG 18
apt install -y postgresql-17-pg-ivm # PG 17
apt install -y postgresql-16-pg-ivm # PG 16
apt install -y postgresql-15-pg-ivm # PG 15
apt install -y postgresql-14-pg-ivm # PG 14
预加载配置:
shared_preload_libraries = 'pg_ivm';
创建扩展:
CREATE EXTENSION pg_ivm;
用法
来源:README, release 1.14
pg_ivm 为 PostgreSQL 物化视图提供 immediate Incremental View Maintenance。它不会全量重算整个视图,而是通过 AFTER triggers 应用 delta,并将元数据保存在 pgivm schema 中。
CREATE EXTENSION pg_ivm;
所需配置
上游指出应预加载 pg_ivm,这样 IMMV 才能被正确维护:
shared_preload_libraries = 'pg_ivm'
session_preload_libraries = 'pg_ivm'
当前 README 说明该扩展兼容 PostgreSQL 13 到 18;最新 GitHub release 为 1.14,发布日期是 2026-03-31。
主要函数
pgivm.create_immv(name, query)创建可增量维护物化视图(IMMV)、其维护触发器,以及在可能时创建唯一索引。pgivm.refresh_immv(name, with_data)全量刷新 IMMV,并可禁用或重新启用维护。pgivm.get_immv_def(regclass)重建已存储的SELECT定义。pgivm.pg_ivm_immv保存 IMMV 元数据,包括immvrelid、viewdef、ispopulated与lastivmupdate。
常见模式
创建 IMMV:
SELECT pgivm.create_immv(
'immv_agg',
'SELECT bid, count(*), sum(abalance), avg(abalance)
FROM pgbench_accounts JOIN pgbench_branches USING(bid)
GROUP BY bid'
);
在基表变更后查询已维护的结果:
UPDATE pgbench_accounts SET abalance = abalance + 1000 WHERE aid = 4112345;
SELECT * FROM immv_agg WHERE bid = 42;
检查或刷新 IMMV:
SELECT immvrelid AS immv, pgivm.get_immv_def(immvrelid)
FROM pgivm.pg_ivm_immv;
SELECT pgivm.refresh_immv('immv_agg', true);
批量操作前暂停维护,之后再重建:
SELECT pgivm.refresh_immv('myview', false);
-- bulk changes
SELECT pgivm.refresh_immv('myview', true);
注意事项
- 上游只支持受限的视图定义子集:join、
DISTINCT、简单子查询/CTE,以及内建聚合count、sum、avg、min、max。 - 不支持的构造包括
HAVING、window functions、ORDER BY、LIMIT/OFFSET、UNION/INTERSECT/EXCEPT、DISTINCT ON与用户自定义聚合。 - 高效维护依赖合适的唯一索引;只有在定义允许时,
create_immv才会自动创建该索引。