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

时间:2019-07-05 14:51:29

标签: oracle performance materialized-views

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

我问这是因为在表上创建索引并在该表上使用视图,并在未索引表上使用物化视图(由refresh complete start with (sysdate) next (sysdate+1) with rowid as创建)会产生相似的性能。

正如我期望的那样,物化视图将更快。

更新

我稍微修改了内容/标题。讨论后,我目前关心的是,实例化视图是实际的实际表还是经过优化的虚拟表。

2 个答案:

答案 0 :(得分:4)

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

关于您的表现难题:

当您说“在未索引表上” 时,您的意思是一个表吗?如果是这样,我们不会期望查询视图,实例化视图或实际数据的时间有所不同:它们都对相同数据量执行全表扫描。

  

考虑视图期望select * from <table> where <condition>的情况。

如果对WHERE子句将数据限制为原始数据的较小子集,我们将对基于该查询的物化视图执行SELECT,以比对实际表执行相同的SELECT更快。仅仅因为对小表(实例化视图)进行全表扫描比对大表进行全表扫描需要的时间更少。如果实例化视图的投影的列数少于基本表的列数,则同样适用。

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

总而言之:唯一的通用调整启发式方法是:花费更少的时间来完成较少的工作。除此之外,不可能一概而论。我们不能讨论一些模糊的“考虑视图具有select * from <table> where <condition>.的情况”,这全都是细节。

答案 1 :(得分:2)

从根本上说,物化视图只是一个表,带有相关查询以填充该表。

考虑到静态数据,通常会希望从物化视图(不带WHERE子句)中执行SELECT *的性能至少与运行物化视图基础的查询一样快,而无需编制索引。

但是,如果我们针对mview向SELECT *添加WHERE子句,则该查询的执行速度可能比运行具有相同WHERE子句的mview底层查询的执行要慢得多。这是因为在mview底层的查询中引用的表可能具有索引来支持WHERE子句中的条件,因为mview可能没有这样的索引。