我正在使用PostgreSQL 9.2.4,并且希望模拟一个实例化视图。是否有任何知名的方法可以做到这一点,包括并发刷新?
[PostgreSQL wiki - materialized views链接到两个基于触发器的实现。
一般的想法是在每个涉及的表上放置AFTER INSERT OR UPDATE OR DELETE ... FOR EACH ROW
触发器,以对目标表进行部分更新。实现是相当特定于视图的性质的。
对于某些更复杂的视图,您实际上无法进行部分更新,而需要进行并发视图刷新。通常,这涉及创建一个新表,填充它,提交,开始新事务,删除旧表,将新表重命名为旧表的名称,然后再次提交。
从9.5开始,Postgres支持并发刷新,如官方文档中的here所述。但是,这样做必须满足两个先决条件:
WHERE
子句。刷新实体化并发视图的命令如下:
REFRESH MATERIALIZED VIEW CONCURRENTLY *mat_view_name*;
请注意,同时刷新实例化视图的速度比正常刷新要慢。但是,它将确保在并发刷新期间,您对实例化视图的所有查询均不会被阻塞。