Answers:
物化视图基于磁盘,并根据查询定义定期更新。
视图仅是虚拟的,每次访问时都运行查询定义。
他们在查询视图时评估视图定义所依据的表中的数据。它是表的逻辑视图,没有数据存储在其他任何地方。
视图的好处是它将始终将最新数据返回给您。视图的缺点在于其性能取决于视图所基于的select语句的质量。如果视图使用的select语句联接许多表,或者使用基于非索引列的联接,则视图的性能可能会很差。
它们与常规视图类似,因为它们是数据的逻辑视图(基于select语句),但是基础查询结果集已保存到表中。这样做的好处是,当您查询实例化视图时,您正在查询的表也可以被索引。
此外,由于所有联接均已在实例化视图刷新时解决,因此您只需一次(或刷新实例化视图时)支付联接的价格,而不是每次从实例化视图中进行选择时都要支付。此外,启用查询重写后,Oracle可以优化查询,以从实例化视图的源中进行选择,从而从实例化视图中进行读取。在您将物化视图创建为聚合表形式或作为频繁执行的查询的副本的情况下,这可以大大加快最终用户应用程序的响应时间。但是不利的是,您从实例化视图中获取的数据仅与上次刷新实例化视图的时间一样最新。
可以将实例化视图设置为手动地,按设定的时间表刷新,或者基于数据库检测到来自基础表之一的数据更改而刷新。可以通过将实例化视图与实例化视图日志结合使用来增量更新实例化日志,这些日志充当基础表上的更改数据捕获源。
物化视图最常用于数据仓库/商业智能应用程序中,其中查询具有成千上万行的大型事实表将导致查询响应时间,从而导致应用程序无法使用。
实例化视图还有助于确保时刻一致,类似于快照隔离。
视图使用查询从基础表中提取数据。
物化视图是磁盘上的一个表,其中包含查询的结果集。
当不可行或不希望使用对其应用索引的标准视图时,实体化视图主要用于提高应用程序性能。可以通过触发器或使用该ON COMMIT REFRESH
选项来定期更新实例化视图。这确实需要一些额外的权限,但这并不复杂。ON COMMIT REFRESH
至少从Oracle 10开始就已经存在。
视图本质上是由给定查询动态填充的类似于逻辑表的结构。视图查询的结果不会存储在磁盘上的任何位置,并且每次执行查询时都会重新创建视图。物化视图是存储在数据库中并写入磁盘的实际结构。它们将根据创建时定义的参数进行更新。
在Mike McAllister的漂亮回答中加了...
如果编译器认为视图查询很简单,则只能将实例化视图设置为通过数据库自动刷新以检测更改。如果认为它太复杂,它将无法设置本质上是内部触发器的组件来跟踪源表中的更改,从而仅更新mview表中的更改行。
创建实例化视图时,您会发现Oracle同时创建了mview 和具有相同名称的表,这会使事情变得混乱。
物化视图是由选择查询驱动的数据逻辑视图,但是查询结果将存储在表或磁盘中,查询的定义也将存储在数据库中。
物化视图的性能优于普通视图,因为物化视图的数据将存储在表中,并且表可能会被索引,因此连接速度更快,并且在物化视图刷新时也进行了连接,因此无需每次触发连接语句,视情况而定。
其他区别包括:在使用View的情况下,我们总是获取最新数据,但是在实现视图的情况下,我们需要刷新视图以获取最新数据。在实例化视图的情况下,我们需要一个额外的触发器或某种自动方法,以便我们可以保持MV的刷新,这对于数据库中的视图不是必需的。