刷新物化视图时,索引是不是也会自动刷新?

Posted

技术标签:

【中文标题】刷新物化视图时,索引是不是也会自动刷新?【英文标题】:When refreshing a materialized view, are indexes also refreshed automatically?刷新物化视图时,索引是否也会自动刷新? 【发布时间】:2014-04-29 01:14:41 【问题描述】:

我目前使用的是 Postgres 9.3.3。

如果您refresh 物化视图,该物化视图上的索引是否也重新索引?还是需要手动重新索引索引?

在查看以下question 时,它看起来像但没有答案,我似乎找不到任何支持文档。

【问题讨论】:

我会把答案留给可以引用可靠来源的人,但有两个想法:1)您可能可以为此构建一个相当决定性的测试:创建一个命中视图索引的查询,然后更改基础数据,以使结果发生变化。如果刷新物化视图显示正确的数据,则索引已更新。 2) 从一致性的角度来看,更新视图的唯一替代方法似乎是使其无效,在这种情况下,您会看到查询计划发生变化。指向不存在数据的索引似乎是一个非常糟糕的主意。 【参考方案1】:

索引当然会保持最新。

快速测试似乎表明它们在每次 REFRESH 后也保持其大小,这表明它们是从头开始重新创建的。这是有道理的,因为我认为每次刷新都会重新创建视图,并且基本上将其重命名到位。

【讨论】:

这是有道理的。由于 Postgres 会重写整个表,因此从头开始重写索引要快得多。【参考方案2】:

Per documentation:

创建索引后,无需进一步干预: 修改表时系统会更新索引...

没有例外。物化视图只是另一个附有如何刷新它的配方的表。所有索引要么从头开始重新创建,要么更新。您永远不需要手动对现有索引执行任何操作。

The manual once more:

在查询中引用物化视图时,数据是 直接从物化视图返回,例如从表中返回;这 规则仅用于填充物化视图。

【讨论】:

我相信OP打算知道在刷新MV后是否需要进行任何相关维护,不一定限于索引。因此@thames 应该注意,在 9.4 版中对 "CONCURRENTLY" 关键字的新支持,如果正在使用该关键字,那么,根据文档,MV“需要 VACUUMing,因为 ... DELETE 会死后面的元组”。并发支持是一件好事,我想它会被广泛采用,这很值得了解。

以上是关于刷新物化视图时,索引是不是也会自动刷新?的主要内容,如果未能解决你的问题,请参考以下文章

如何做到物化视图的自动刷新

Oracle设置物化视图的自动刷新

Oracle-视图

使用规则或通知自动刷新物化视图

PG 物化视图

从存储过程刷新物化视图时出错(不是有效月份)