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

时间:2020-03-06 14:21:53  来源:igfitidea点击:

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

解决方案

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

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

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

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

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

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

在查询视图时,视图会评估视图定义所依据的表中的数据。它是表的逻辑视图,没有数据存储在其他任何地方。视图的好处是它将始终将最新数据返回给我们。视图的缺点在于其性能取决于视图所基于的select语句的质量。如果视图使用的select语句联接许多表,或者使用基于非索引列的联接,则视图的性能可能会很差。

物化视图与常规视图相似,因为它们是数据的逻辑视图(基于select语句),但是底层查询结果集已保存到表中。这样做的好处是,当我们查询实例化视图时,我们正在查询的表也可能已建立索引。此外,由于所有联接均已在实例化视图刷新时解决,因此我们只需为联接(而不是每次从实例化视图中进行选择)支付价格(或者刷新实体化视图的次数)。此外,启用查询重写后,Oracle可以优化查询,以从实例化视图的源中进行选择,从而从实例化视图中进行读取。在我们将物化视图创建为聚合表形式或者作为频繁执行的查询的副本的情况下,这可以大大加快最终用户应用程序的响应时间。但是缺点是,我们从实例化视图中获取的数据仅是最新一次刷新了实例化视图的最新数据。

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

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

添加到迈克·麦卡里斯特(Mike McAllister)漂亮的答案中...

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

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