Oracle中的视图和实例化视图之间有什么区别?


Answers:


355

物化视图基于磁盘,并根据查询定义定期更新。

视图仅是虚拟的,每次访问时都运行查询定义。


54
同样,当您需要不需要最新数据的性能时,物化视图会更好,但是您的数据将比标准视图中的数据更旧。通常,BI报告从实例化视图中获得很多好处。
Marthinus

29
@Marthinus-这是正确的,除非在实例化视图中是REFRESH ON COMMIT的情况下-MV将完全返回已提交的数据。
杰弗里·肯普

2
DISK based是什么意思?这是否意味着表格不是DISK的一部分?它是否存储在文件中,并且DISK访问要比File访问....快?
Kanagavelu Sugumar 2014年

1
@KanagaveluSugumar是的,实际的表也被写入磁盘。
dacracot

5
@dacracot谢谢!我认为您是要说DISK中的DB表以外的内容;该MVIEW还通过解析所有联接来维护一个表。这样在运行时单个表访问就足够了;无需查询多个表的联接条件,这通常是通过普通视图完成的。谢谢!
Kanagavelu Sugumar 2014年

332

观看次数

他们在查询视图时评估视图定义所依据的表中的数据。它是表的逻辑视图,没有数据存储在其他任何地方。

视图的好处是它将始终将最新数据返回给您视图缺点在于其性能取决于视图所基于的select语句的质量。如果视图使用的select语句联接许多表,或者使用基于非索引列的联接,则视图的性能可能会很差。

物化视图

它们与常规视图类似,因为它们是数据的逻辑视图(基于select语句),但是基础查询结果集已保存到表中。这样做的好处是,当您查询实例化视图时,您正在查询的表也可以被索引。

此外,由于所有联接均已在实例化视图刷新时解决,因此您只需一次(或刷新实例化视图时)支付联接的价格,而不是每次从实例化视图中进行选择时都要支付。此外,启用查询重写后,Oracle可以优化查询,以从实例化视图的源中进行选择,从而从实例化视图中进行读取。在您将物化视图创建为聚合表形式或作为频繁执行的查询的副本的情况下,这可以大大加快最终用户应用程序的响应时间。但是不利的是,您从实例化视图中获取的数据仅与上次刷新实例化视图的时间一样最新


可以将实例化视图设置为手动地,按设定的时间表刷新,或者基于数据库检测到来自基础表之一的数据更改而刷新。可以通过将实例化视图与实例化视图日志结合使用来增量更新实例化日志,这些日志充当基础表上的更改数据捕获源

物化视图最常用于数据仓库/商业智能应用程序中,其中查询具有成千上万行的大型事实表将导致查询响应时间,从而导致应用程序无法使用。


实例化视图还有助于确保时刻一致,类似于快照隔离


9
+1为详细说明,但是查询重写的缺点是什么?如果查询重写将允许Oracle进一步优化查询,那么我们应该始终启用查询重写,不是吗?
Rosdi Kasim

6
@Rosdi,他说:“您从实例化视图中获取的数据仅是最新一次刷新了实例化视图的最新数据”
Jeffrey Kemp 2010年

49

视图使用查询从基础表中提取数据。

物化视图是磁盘上的一个表,其中包含查询的结果集。

当不可行或不希望使用对其应用索引的标准视图时,实体化视图主要用于提高应用程序性能。可以通过触发器或使用该ON COMMIT REFRESH选项来定期更新实例化视图。这确实需要一些额外的权限,但这并不复杂。ON COMMIT REFRESH至少从Oracle 10开始就已经存在。


可以在物化视图中指定“提交时刷新”选项
Hybris95,2005年

谢谢!我将更新答案。您知道何时将此功能添加到Oracle吗?
耶利米·佩斯卡

20

视图本质上是由给定查询动态填充的类似于逻辑表的结构。视图查询的结果不会存储在磁盘上的任何位置,并且每次执行查询时都会重新创建视图。物化视图是存储在数据库中并写入磁盘的实际结构。它们将根据创建时定义的参数进行更新。


DISK based是什么意思?这是否意味着表格不是DISK的一部分?它是否存储在文件中,并且DISK访问要比File访问....快?
Kanagavelu Sugumar 2014年

18

物化视图 -磁盘上包含查询结果集的表

非标准化视图 -从基础表中提取数据的查询


7

视图:视图只是一个命名查询。它不存储任何内容。视图上存在查询时,它将运行视图定义的查询。实际数据来自表。

物化视图:物理存储数据并定期更新。查询MV时,它会提供MV中的数据。


2

在Mike McAllister的漂亮回答中加了...

如果编译器认为视图查询很简单,则只能将实例化视图设置为通过数据库自动刷新以检测更改。如果认为它太复杂,它将无法设置本质上是内部触发器的组件来跟踪源表中的更改,从而仅更新mview表中的更改行。

创建实例化视图时,您会发现Oracle同时创建了mview 和具有相同名称的表,这会使事情变得混乱。


支持实例化视图的表的名称与视图不同。
杰弗里·肯普

@JeffreyKemp,您确定吗?这里接受的答案stackoverflow.com/a/33552513另有要求。尽管是的,但您在2010年发表评论时可能会有所不同...
leqid

我在上面的评论肯定是针对旧版本的(可能是9i)。没错,MV至少在现代版本中具有相同的名称。
杰弗里·肯普

1

物化视图是由选择查询驱动的数据逻辑视图,但是查询结果将存储在表或磁盘中,查询的定义也将存储在数据库中。

物化视图的性能优于普通视图,因为物化视图的数据将存储在表中,并且表可能会被索引,因此连接速度更快,并且在物化视图刷新时也进行了连接,因此无需每次触发连接语句,视情况而定。

其他区别包括:在使用View的情况下,我们总是获取最新数据,但是在实现视图的情况下,我们需要刷新视图以获取最新数据。在实例化视图的情况下,我们需要一个额外的触发器或某种自动方法,以便我们可以保持MV的刷新,这对于数据库中的视图不是必需的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.