在Oracle中,可以刷新部分数据。但是在PostgreSQL中,自9.3版本(当前版本)开始支持物化视图,这并不算太久。所以我想知道:在PostgreSQL 9.3中,是否可以刷新物化视图中的部分数据?如果可以,如何操作?
在Oracle中,可以刷新部分数据。但是在PostgreSQL中,自9.3版本(当前版本)开始支持物化视图,这并不算太久。所以我想知道:在PostgreSQL 9.3中,是否可以刷新物化视图中的部分数据?如果可以,如何操作?
目前,PostgreSQL不支持材料化视图的渐进/部分更新。
9.4版本新增了REFRESH MATERIALIZED VIEW CONCURRENTLY
,但它仍然需要完全重新生成。
希望如果有人充满热情的话,我们会在9.5中看到支持。只有对于简单的材料化视图而言,才能够不使用用户定义的触发器/规则进行此操作,而且即使处理像增量更新 count(...) ... GROUP BY ...
这样的内容也需要特殊支持。
你所提到的Oracle解决方案实际上并非增量刷新。 它是按分区刷新。 为了让PostgreSQL原生支持它,它首先必须支持真正的声明式分区 - 而它目前没有这个功能,尽管我们正在讨论是否可以在9.5中实现。
VIEW
中连接和/或联合了单个部分:
material_col1
,material_col2
等)创建一个MATERIALIZED VIEW
,例如使用共同的id
列。VIEW
(fake_materialized_view
) 连接这些MATERIALIZED VIEW
表,连接条件为id
列。
union all
REFRESH MATERIALIZED VIEW
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
(更新1:感谢Barry使用行分区的评论,我已将其添加到答案中。)
union all
可以正常工作。它不会在每种情况下都有帮助,但对于聚合的物化视图来说,它可以很好地工作。 - Barry Kelly