用并发刷新模拟PostgreSQL中的物化视图



我正在使用PostgreSQL 9.2.4,并希望模拟物化视图。有什么众所周知的方法可以做到这一点,包括并发刷新吗?

PostgreSQL wiki物化视图链接到两个基于触发器的实现。

一般的想法是将AFTER INSERT OR UPDATE OR DELETE ... FOR EACH ROW触发器放在对目标表进行部分更新的每个相关表上。实现是相当特定于视图的性质的。

对于一些更复杂的视图,你真的不能做局部更新,而需要做并发视图刷新。这通常包括创建一个新表、填充它、提交、开始一个新事务、删除旧表、将新表重命名为旧表的名称,然后再次提交。

从9.5开始,Postgres支持并发刷新,正如官方文档中所述。但是,这样做需要满足两个前提条件:

  1. 必须在物化视图上创建唯一的索引
  2. 唯一索引必须包含物化视图的所有记录。换句话说,您不能在创建索引命令中使用WHERE子句。

刷新物化并发视图的命令如下:

REFRESH MATERIALIZED VIEW CONCURRENTLY *mat_view_name*;

请注意,并发刷新物化视图比正常刷新要慢。但是,它将确保在并发刷新期间对物化视图的任何查询都不会被阻塞。

最新更新