pg_ivm

增量维护的物化视图

概览

扩展包名版本分类许可证语言
pg_ivm1.15FEATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2840pg_ivmpg_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 大版本包名依赖
EXTMIXED1.151817161514pg_ivm-
RPMPGDG1.151817161514pg_ivm_$v-
DEBPIGSTY1.151817161514postgresql-$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;

用法

来源:

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 和内置 countsumavgminmax 聚合。不支持的结构包括 HAVING、窗口函数、ORDER BYLIMIT/OFFSET、集合操作、DISTINCT ON 和用户定义的聚合。
  • 高效维护依赖于合适的唯一索引。当定义提供可用分组、去重或基表主键列时,create_immv() 会自动创建一个。
  • 创建和刷新需要 AccessExclusiveLock。上游警告在 REPEATABLE READSERIALIZABLE 下创建的一致性风险;使用 READ COMMITTED 或者在之后进行刷新。
  • 当关系已注册或其表定义与提供的查询不符时,restore_immv() 会失败。
  • 1.15 版还修复了多次触发驱动修改后的不正确维护和 v1.14 的外连接维护崩溃问题。