Oracle中的视图和物化视图有什么区别?

Oracle中的视图和物化视图有什么区别?

748009 次浏览

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

视图仅为虚拟视图,并且在每次访问视图时运行查询定义。

视图使用查询从底层表中提取数据。

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

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

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

的观点

它们计算视图定义在查询视图时下面的表中的数据。它是表的逻辑视图,没有数据存储在其他任何地方。

视图的优点是它将总是返回最新的数据给您视图的缺点是它的性能取决于视图所基于的选择语句有多好。如果视图使用的select语句连接许多表,或者使用基于非索引列的连接,则视图的性能可能很差。

物化视图

它们类似于常规视图,因为它们是数据的逻辑视图(基于选择语句),然而,底层查询结果集已保存到表中。这样做的好处是,当你查询一个物化视图正在查询表时,它也可以被索引。

此外,由于所有连接都在实体化视图刷新时被解析,因此只需支付一次连接代价(或在刷新实体化视图时支付一次),而不是每次从实体化视图中选择时都支付。此外,通过启用查询重写,Oracle可以优化从物化视图源中选择的查询,使其从物化视图中读取。在将物化视图作为聚合表的形式或作为频繁执行的查询的副本创建的情况下,这可以极大地加快最终用户应用程序的响应时间。但缺点是,从物化视图中获得的数据仅与上一次刷新物化视图时的数据相同


物化视图可以设置为手动刷新,在一个设置的时间表或基于从底层表之一检测数据变化的数据库。实体化视图可以通过将它们与实体化视图日志结合来增量更新,这些日志在底层表上充当变更数据捕获源

物化视图最常用于数据仓库/商业智能应用程序中,在这些应用程序中,查询具有数百万行的大型事实表将导致查询响应时间延长,从而导致应用程序不可用。


物化视图也有助于保证时刻的一致性,类似于快照隔离

再加上迈克·麦卡利斯特相当彻底的回答……

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

当你创建一个物化视图时,你会发现Oracle创建了mview 还有一张同名的表,这可能会让事情变得混乱。

实现视图 -磁盘上的一个表,包含查询的结果集

Non-materiased视图 -从底层表中提取数据的查询

观点: View只是一个命名查询。它不存储任何东西。当视图上有查询时,它将运行对视图定义的查询。实际数据来自表格。

实现视图:物理存储数据,并定期更新。在查询MV时,给出MV的数据。

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

实体化视图的性能比普通视图好,因为实体化视图的数据将存储在表中,表可以被索引,因此连接更快,连接是在实体化视图刷新时完成的,因此不需要每次都像视图那样触发连接语句。

其他区别包括在视图的情况下,我们总是获得最新的数据,但在物化视图的情况下,我们需要刷新视图以获得最新的数据。 在物化视图的情况下,我们需要一个额外的触发器或一些自动方法,以便我们可以保持MV刷新,这对于数据库中的视图是不需要的