刷新物化视图时,索引是不是也会自动刷新?
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 会死后面的元组”。并发支持是一件好事,我想它会被广泛采用,这很值得了解。以上是关于刷新物化视图时,索引是不是也会自动刷新?的主要内容,如果未能解决你的问题,请参考以下文章