pg_ivm
增量维护的物化视图
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_ivm | 1.15 | 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 |
|---|
PGDG RPM and PIGSTY DEB are aligned at 1.15 for PostgreSQL 14-18.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 1.15 | 1817161514 | pg_ivm | - |
| RPM | PGDG | 1.15 | 1817161514 | pg_ivm_$v | - |
| DEB | PIGSTY | 1.15 | 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 为 PostgreSQL 提供了即时增量视图维护功能。增量可维护材料化视图(IMMV)以表的形式存储在 pgivm 模式中,带有触发器和元数据;基表的变化会在同一个事务中更新 IMMV 而不是重新计算整个查询。
启用并创建一个 IMMV
为可以修改 IMMV 基表的每个会话加载库。集群级设置需要重启:
shared_preload_libraries = 'pg_ivm'
session_preload_libraries = 'pg_ivm' 也可以在所有相关会话中一致管理时使用。
CREATE EXTENSION pg_ivm;
SELECT pgivm.create_immv(
'account_totals',
'SELECT branch_id, count(*) AS accounts, sum(balance) AS balance
FROM accounts
GROUP BY branch_id'
);
UPDATE accounts
SET balance = balance + 100
WHERE account_id = 42;
SELECT * FROM account_totals;
管理和检查 IMMV
pgivm.create_immv(name, query): 创建并填充一个 IMMV,返回其行数。pgivm.refresh_immv(name, with_data): 完全重建 IMMV;false在后续填充刷新之前禁用维护。pgivm.get_immv_def(regclass): 返回存储的视图定义。pgivm.restore_immv(name, query, populate): 1.15 版本函数,用于重构现有 IMMV 表的元数据、触发器和索引。pgivm.get_create_immv_commands()和pgivm.get_restore_immv_commands(): 发出重建 IMMV 或恢复其元数据所需的 SQL。
1.15 版包括一个用于导出或 pg_upgrade 工作流的辅助工具:
pg_ivm_dump_metadata -d application > pg_ivm_metadata.sql
该脚本发出 pgivm.restore_immv() 调用。先恢复表数据,然后执行保存的元数据 SQL 以使增量维护继续进行而不必重新创建表。
限制和操作注意事项
- 支持的定义包括选择性连接、
DISTINCT、简单的子查询/CTE 和内置count、sum、avg、min和max聚合。不支持的结构包括HAVING、窗口函数、ORDER BY、LIMIT/OFFSET、集合操作、DISTINCT ON和用户定义的聚合。 - 高效维护依赖于合适的唯一索引。当定义提供可用分组、去重或基表主键列时,
create_immv()会自动创建一个。 - 创建和刷新需要
AccessExclusiveLock。上游警告在REPEATABLE READ或SERIALIZABLE下创建的一致性风险;使用READ COMMITTED或者在之后进行刷新。 - 当关系已注册或其表定义与提供的查询不符时,
restore_immv()会失败。 - 1.15 版还修复了多次触发驱动修改后的不正确维护和 v1.14 的外连接维护崩溃问题。