是否有可能部分刷新PostgreSQL中的物化视图?

Pav*_* V. 16 postgresql materialized-views postgresql-9.3

在Oracle中,可以仅刷新部分数据.但是在PostgreSQL中,自9.3(现在的版本)支持物化视图,这不是很长.所以我想知道:是否可以刷新PostgreSQL 9.3中物化视图中的部分数据?如果是的话,该怎么办?

Cra*_*ger 22

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

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

如果有人热情的话,我们希望能在9.5中得到支持.只有在没有用户定义的简单物化视图的触发器/规则的情况下才可能这样做,并且甚至需要特殊支持来处理诸如增量更新之类的事情count(...) ... GROUP BY ....

但是,您提到的Oracle答案实际上并不是增量刷新.它是按分区刷新的.为了让PostgreSQL本身支持它,它首先必须支持真正的声明性分区 - 尽管我们正在讨论它是否可以在9.5中完成.

  • 这个答案还适用于14.5吗? (4认同)
  • 是的,不幸的是,它似乎仍然是全部或全部没有根据我在下面链接的文档“刷新物化视图完全取代了物化视图的内容。”请参阅https://www.postgresql.org/docs/current/sql-刷新materializedview.html (2认同)

n10*_*000 6

我刚刚遇到了类似的问题。从Craig 的回答中了解到这是不可能的,我使用了一种解决方法。我解构了物化视图并将各个部分加入和/或联合在一个VIEW

  1. 创建MATERIALIZED VIEW用于所讨论的每一行或列组(material_col1material_col2等,或更复杂的间断,其中的条件),使用例如公共id列。
  2. 使用常规的VIEWfake_materialized_viewjoin荷兰国际集团将MATERIALIZED VIEW在S表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
Run Code Online (Sandbox Code Playgroud)

(更新 1:感谢 Barry使用行分区发表评论,我已将其添加到答案中。)

  • 不幸的是,这只对“分区列”有用,对“分区行”没有帮助(不一定映射到简单的可定义分区,而是映射到单个行) (2认同)