pg_ivm

增量维护的物化视图

概览

扩展包名版本分类许可证语言
pg_ivm1.13FEATPostgreSQLC
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.131817161514pg_ivm-
RPMPIGSTY1.131817161514pg_ivm_$v-
DEBPIGSTY1.131817161514postgresql-$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

构建

您可以使用 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;

用法

pg_ivm: PostgreSQL 增量视图维护

pg_ivm 扩展提供增量视图维护(IVM)功能,通过仅应用增量变更而非完全重算来更新物化视图。视图在基表修改时通过 AFTER 触发器立即更新。

CREATE EXTENSION pg_ivm;

配置

pg_ivm 添加到预加载库以确保正确维护:

shared_preload_libraries = 'pg_ivm'

函数

create_immv

pgivm.create_immv(immv_name text, view_definition text) RETURNS bigint

创建增量可维护物化视图(IMMV)。触发器会自动创建以保持视图更新。如果可能,会自动创建唯一索引。

SELECT pgivm.create_immv('myview', 'SELECT * FROM mytab');

refresh_immv

pgivm.refresh_immv(immv_name text, with_data bool) RETURNS bigint

完全替换 IMMV 内容。with_data = false 时,IMMV 变为未填充状态且触发器被移除。with_data = true 时,触发器和索引会重新创建。

SELECT pgivm.refresh_immv('myview', true);

get_immv_def

pgivm.get_immv_def(immv regclass) RETURNS text

返回 IMMV 的重构 SELECT 命令。

IMMV 元数据目录

pgivm.pg_ivm_immv 目录存储 IMMV 信息:

类型描述
immvrelidregclassIMMV 的 OID
viewdeftext视图定义的查询树
ispopulatedboolIMMV 当前是否已填充

示例

创建带聚合的 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) AS def
FROM pgivm.pg_ivm_immv;

使用 DROP TABLE 删除 IMMV:

DROP TABLE myview;

禁用/启用维护

在批量修改前禁用即时维护,然后刷新:

SELECT pgivm.refresh_immv('myview', false);   -- 禁用
-- ... 批量修改 ...
SELECT pgivm.refresh_immv('myview', true);    -- 刷新并重新启用

支持的查询功能

  • 内连接和外连接(包括自连接)
  • DISTINCT 子句
  • 聚合函数:countsumavgminmax
  • FROM 子句中的简单子查询
  • WHERE 子句中的 EXISTS 子查询
  • 简单 CTE(WITH 查询)
  • GROUP BY 子句

最后修改 2026-03-14: update extension metadata (953cbd0)