2014-09-03 88 views
14

In Oracle, it is possible to refresh just part of the data。但是在PostgreSQL中,物化视图自9.3(现在的版本)开始支持,并不长。所以我想知道:是否可以刷新PostgreSQL 9.3中物化视图中的部分数据?如果是的话,该怎么做?是否可以部分刷新PostgreSQL中的物化视图?

+1

你能举一个你的意思吗?我认为拥有物化视图的重点只是显示部分数据。 – Lucas 2014-09-03 09:54:49

+0

与甲骨文链接的答案并不十分引人注目。它说你可以强制换出分区MV的一个分区。由于Postgresql中的分区并不是真正的内置功能,而是您自己推出的东西,所以我想您也可以在Postgres中使用相同的方法。 – Thilo 2014-09-03 09:58:22

回答

20

PostgreSQL不支持物化视图的渐进/部分更新。

9.4增加REFRESH MATERIALIZED VIEW CONCURRENTLY但它仍然必须完全重新生成。

希望如果有人足够热心,我们会在9.5中看到支持。尽管如此,只有通过用户定义的触发器/规则才能实现这个功能,并且需要特殊的支持来处理诸如count(...) ... GROUP BY ...的增量更新之类的事情。

但是,您引用的Oracle答案实际上并不是实际的增量刷新。这是分区刷新。为了支持PostgreSQL本身,它首先必须支持真正的声明式分区 - 虽然我们正在讨论它是否可以在9.5中完成,但它不支持。

4

我刚碰到类似的问题。从Craig's answer学习,这是不可能的,我使用了一种解决方法。我解构物化视图和在VIEW接合的各个部分:

  1. 对于所讨论的每一列(material_col1material_col2等)创建MATERIALIZED VIEW,使用通用id柱。
  2. 使用常规VIEWfake_materialized_view)在id列加入MATERIALIZED VIEW小号表
  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; 
+0

不幸的是,这只对“分区列”有帮助,而不是“分区行”(不一定映射到简单的可定义分区,而是映射到单个行) – 2016-03-21 19:20:59

+0

@AndreasDietrich我想你可以用'UNION ALL'做类似的事情。 .. – n1000 2016-03-23 14:32:19