pg_ivm 是 PostgreSQL 的物化视图增量维护扩展。它在基表变更的同一事务内通过触发器更新视图,避免每次都重新计算整个查询结果,解决定时刷新导致数据延迟和全量开销大的问题。
该扩展支持 PostgreSQL 13 到 19,最新版本 1.16 已适配 PostgreSQL 19。安装方式为 make install 后执行 CREATE EXTENSION pg_ivm,并建议将其加入 shared_preload_libraries 或 session_preload_libraries,变更后需要重启数据库。使用 pgivm.create_immv 函数创建增量维护的物化视图,基表的 INSERT、UPDATE、DELETE 会自动触发对视图中受影响行的局部修补,读写不会出现数据不一致的窗口。
官方示例显示,在 1000 万行 pgbench 数据集上,普通物化视图刷新一行变更需 20.5 秒,而使用 pg_ivm 后单行写入额外开销约 6 毫秒,视图始终保持最新。聚合视图支持 count、sum、avg、min、max 五种内置聚合,但 real 或 double precision 列上的 sum/avg 可能产生漂移,建议使用 numeric 类型。视图上必须保留合适的索引,否则增量更新会退化为顺序扫描,写入性能会显著下降。
该扩展有一些使用限制:不支持窗口函数、HAVING、ORDER BY、LIMIT、UNION 等语法,基表必须是普通表,不支持视图、分区表和外表,也不支持逻辑复制订阅端。频繁写入或大批量导入的表不适合直接使用,大写入前可调用 pgivm.refresh_immv 临时关闭维护,导入后再重建。pg_dump 不包含扩展元数据,备份和恢复前需使用随扩展提供的 pg_ivm_dump_metadata 脚本处理。
