pg_ivm

增量维护的物化视图

概览

扩展包名版本分类许可证语言
pg_ivm1.14FEATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2840pg_ivmpg_catalog
相关扩展age hll rum pg_graphql pg_jsonschema jsquery pg_hint_plan

deb takeover by pgdg since 2026-01

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.141817161514pg_ivm-
RPMPIGSTY1.141817161514pg_ivm_$v-
DEBPIGSTY1.141817161514postgresql-$v-pg-ivm-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

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

pig build pkg pg_ivm         # 构建 DEB 包

安装

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

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 元数据,包括 immvrelidviewdefispopulatedlastivmupdate

常见模式

创建 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,以及内建聚合 countsumavgminmax
  • 不支持的构造包括 HAVING、window functions、ORDER BYLIMIT/OFFSETUNION/INTERSECT/EXCEPTDISTINCT ON 与用户自定义聚合。
  • 高效维护依赖合适的唯一索引;只有在定义允许时,create_immv 才会自动创建该索引。

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