402

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

4

8 回答 8

413

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

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

于 2008-09-18T15:25:55.363 回答
373

意见

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

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

物化视图

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

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


物化视图可以设置为手动刷新、按设定的时间表刷新,或者基于数据库检测到来自其中一个基础表的数据变化。物化视图可以通过与物化视图日志相结合来增量更新,物化视图日志充当基础表上的更改数据捕获源。

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


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

于 2008-09-18T16:23:58.173 回答
63

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

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

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

于 2008-09-18T15:28:05.267 回答
24

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

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

于 2012-05-13T09:44:56.213 回答
23

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

于 2008-09-18T15:31:54.087 回答
11

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

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

于 2017-03-27T18:02:21.120 回答
3

添加到迈克麦卡利斯特的相当彻底的答案......

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

当您创建物化视图时,您会发现 Oracle 同时创建了 mview和同名的表,这会使事情变得混乱。

于 2009-01-04T04:05:17.497 回答
2

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

物化视图的性能优于普通视图,因为物化视图的数据将存储在表中,并且表可能会被索引,因此连接速度更快,并且连接是在物化视图刷新时完成的,因此无需每次触发join 语句与视图的情况一样。

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

于 2019-11-15T13:58:51.750 回答