在PostgreSQL中,是否可以部分刷新一个物化视图?

问题描述 投票:16回答:2

在Oracle中,可以只刷新部分数据。. 但在PostgreSQL中,从9.3(目前的版本)开始就支持物化视图,时间并不长。所以我想知道:在PostgreSQL 9.3中,是否可以只刷新物化视图中的部分数据?如果可以,怎么做?

postgresql postgresql-9.3 materialized-views
2个回答
22
投票

PostgreSQL还不支持物化视图的逐步部分更新。

9.4增加了 REFRESH MATERIALIZED VIEW CONCURRENTLY 但还是要完全再生。

如果有人足够热心的话,希望我们能在9.5中看到支持。不过,对于简单的物化视图来说,如果没有用户定义的触发器规则,就只能做到这一点,而且甚至需要特殊的支持来处理诸如增量更新 count(...) ... GROUP BY ....

不过你提到的Oracle的答案其实并不是增量刷新,而是按分区刷新。它是按分区刷新。要想让PostgreSQL原生支持这个功能,它首先要支持真正的声明式分区--但它并不支持,尽管我们正在讨论是否可以在9.5中实现。


4
投票

我刚刚遇到了一个类似的问题。学习 克雷格的回答 这是不可能的,我使用了一个变通方法。我对物化视图进行了解构,并将各个部分连接或合并到一个新的视图中。VIEW:

  1. 创建一个 MATERIALIZED VIEW 的每一行或每一列组(material_col1, material_col2等,或与更复杂的不连贯的 哪儿 的条件下),使用例如常见的。id 列。
  2. 使用常规的 VIEW (fake_materialized_view) join摄取 MATERIALIZED VIEW的表格 id 专栏
    • 如果是互不相干的行,就得 union all 他们
  3. REFRESH MATERIALIZED VIEW 根据需要
  4. 使用您的查询 fake_materialized_view 而是

VIEW 会看起来有点像这样。

CREATE VIEW fake_materialized_view AS 

  SELECT m1.id, m1.col1, m2.col2
  FROM material_col1 as m1 LEFT JOIN 
       material_col2 as m2 
         ON m1.id = m2.id

  -- in case of additional row partitioning, e.g.
  -- UNION ALL SELECT m3.id, m3.col1, m3.col2
  -- FROM material_col3 m3

(Upd1: Thx to Barry for his 评论 利用行分区,这是我在答案中补充的)。)

© www.soinside.com 2019 - 2024. All rights reserved.