是否可以在PostgreSQL中部分刷新物化视图?
。但是在PostgreSQL中,物化视图从9.3(现在的版本)开始就得到了支持,时间不长。所以我想知道:在PostgreSQL 9.3中,是否可以只刷新物化视图中的部分数据?如果是,怎么做?PostgreSQL还不支持物化视图的渐进/部分更新 9.4增加了,但仍需完全重新生成 如果有人足够热情,我们希望在9.5中看到支持。但是,对于简单的物化视图,只有在没有用户定义的触发器/规则的情况下才能做到这一点,甚至需要特殊的支持来处理是否可以在PostgreSQL中部分刷新物化视图?,postgresql,postgresql-9.3,materialized-views,Postgresql,Postgresql 9.3,Materialized Views,。但是在PostgreSQL中,物化视图从9.3(现在的版本)开始就得到了支持,时间不长。所以我想知道:在PostgreSQL 9.3中,是否可以只刷新物化视图中的部分数据?如果是,怎么做?PostgreSQL还不支持物化视图的渐进/部分更新 9.4增加了,但仍需完全重新生成 如果有人足够热情,我们希望在9.5中看到支持。但是,对于简单的物化视图,只有在没有用户定义的触发器/规则的情况下才能做到这一点,甚至需要特殊的支持来处理计数(…)的增量更新之类的事情。。。分组依据… 不过,您提到的Orac
计数(…)的增量更新之类的事情。。。分组依据…
不过,您提到的Oracle答案实际上不是增量刷新。它是按分区刷新的。为了让PostgreSQL在本机上支持这一点,它首先必须支持真正的声明性分区,而事实并非如此,尽管我们正在讨论是否可以在9.5中实现它。我刚刚遇到了一个类似的问题。从中了解到这是不可能的,我使用了一种变通方法。我解构了物化视图,并在
视图中连接和/或联合了各个部分:
使用公共的id
列等,为每个有问题的行或列组创建物化视图(material\u col1
,material\u col2
,等等),或在有条件的地方创建更复杂的间断视图
使用常规的视图
(伪物化视图
)连接在id
列上的物化视图
s表
- 对于不相交的行,必须
合并所有行
根据需要刷新物化视图
改为在伪物化视图上使用您的查询
视图
看起来有点像这样:
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感谢Barry利用行分区,我将其添加到了答案中。)你能举个例子说明你的意思吗?我认为拥有物化视图的目的是只显示部分数据。您为Oracle链接的答案不是很有说服力。它说您可以强制地将其中一个分区换成一个分区的MV。由于Postgresql中的分区不是真正的内置功能,而是您自己开发的功能,我想您也可以在Postgres中使用相同的方法。不幸的是,这只对“分区列”有用,对“分区行”没有帮助(不一定映射到简单的可定义分区,而是映射到单个行)@AndreasDietrich在一组物化视图上使用union all
,每个分区一个,如果分区列表相对固定,就可以正常工作。这在每个用例中都不会有帮助,但对于聚合的物化视图也可以。@n1000:嘿,我刚刚意识到,我编辑了你的答案,我以为是我的:/…对不起如果编辑不适合你…那么让我们还原它,我将发布一个自己的版本,并附带示例作为单独的答案。