pg_ivm
增量维护的物化视图
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_ivm | 1.13 | 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.13 | 1817161514 | pg_ivm | - |
| RPM | PIGSTY | 1.13 | 1817161514 | pg_ivm_$v | - |
| DEB | PIGSTY | 1.13 | 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;
用法
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 信息:
| 列 | 类型 | 描述 |
|---|---|---|
immvrelid | regclass | IMMV 的 OID |
viewdef | text | 视图定义的查询树 |
ispopulated | bool | IMMV 当前是否已填充 |
示例
创建带聚合的 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子句- 聚合函数:
count、sum、avg、min、max FROM子句中的简单子查询WHERE子句中的EXISTS子查询- 简单 CTE(
WITH查询) GROUP BY子句