物化视图是虚拟表还是具有真实数据的真实表?

Are materialized views virtual tables or real tables with real data?

在 Oracle 中创建物化视图时,它们存储索引还是存储实际的 table 值?

我问这个是在 table 上创建索引并在 table 上使用视图并在未索引的 table 上使用物化视图(使用 refresh complete start with (sysdate) next (sysdate+1) with rowid as 创建)给出类似的性能。

正如我所期望的那样,物化视图要快得多。

更新

我稍微修改了content/title。讨论后我目前关心的是物化视图是真实的 tables 还是经过一些优化的虚拟 tables。

物化视图创建数据的副本。就所有意图和目的而言,它们都是实际的 table。事实上,我们可以使用 PREBUILT 子句从现有的 table 创建物化视图。唯一的区别是数据的掌握方式——物化视图不拥有其数据,table 拥有。

关于你的表现难题:

当你说"on unindexed table"时,你的字面意思是一个table吗?如果是这样,我们预计查询视图、物化视图或实际数据的时间不会有任何差异:它们都对相同的数据量执行完整的 table 扫描。

Consider the case where views have expecting select * from <table> where <condition>.

如果 WHERE 子句将数据限制为原始数据的子集明显更小。仅仅是因为对小 table(物化视图)的完整 table 扫描比对大 table 的完整 table 扫描花费的时间更少。如果实体化视图的投影的列数少于基础 table.

,则同样适用

索引是另一回事。除非查询选择了非常小的数据子集,否则它不会比完整的 table 扫描和过滤器更有效。

总结:唯一的通用调整启发式是:花更少的时间做更少的工作。除此之外,不可能一概而论。我们不能讨论一些模糊的 "consider the case where views have select * from <table> where <condition>." 都是关于细节的。

从根本上说,实体化视图只是一个 table 以及用于填充它的关联查询。

给定静态数据,人们通常期望 SELECT * 来自实体化视图(没有 WHERE 子句)的性能至少与 运行 作为基础的查询一样快物化视图,不考虑索引。

但是,如果我们将 WHERE 子句添加到 SELECT * 以针对 mview,则该查询的执行速度可能会比 运行 以相同 WHERE 子句作为 mview 基础的查询执行得慢得多。这是因为 mview 底层查询中引用的 tables 可能有索引来支持 WHERE 子句中的条件,而 mview 可能没有这样的索引。