在Oracle中,视图(Views)和物化视图(Materialized Views)有什么区别?
在Oracle中,视图(Views)和物化视图(Materialized Views)有什么区别?
物化视图是基于磁盘的,根据查询定义定期更新。
视图仅为虚拟的,并在每次访问时运行查询定义。
视图在查询时会评估底层表中的数据{{,}}是您表的逻辑视图,没有任何数据存储在其他地方。
视图的好处是它将始终向您返回最新的数据{{;}}视图的缺点在于其性能取决于视图所基于的选择语句的好坏。如果视图使用的选择语句连接了许多表或使用了基于非索引列的连接,则视图的性能可能很差。
它们类似于常规视图{{,}}因为它们是根据选择语句创建的数据的逻辑视图,但是{{,}}底层查询结果集已经保存到一个表中。这样做的好处是当您查询物化视图时{{,}}您正在查询一个表{{,}}该表也可以建立索引。
此外,由于所有连接都在物化视图刷新时解析,因此您只需支付一次连接的代价(或者在刷新物化视图时频繁进行),而不是每次从物化视图中选取时。此外,启用查询重写后,Oracle 可以优化从物化视图源中选取的查询,使其改为从物化视图读取。在创建物化视图作为聚合表单或频繁执行的查询副本的情况下,这可以大大加快最终用户应用程序的响应时间。{{但缺点是您从物化视图中获取的数据只有在上次刷新物化视图时才是最新的}}。
物化视图还有助于保证与快照隔离类似的一致时间点。
视图使用查询从底层表中提取数据。
物化视图是存储在磁盘上的表,其中包含查询的结果集。
物化视图主要用于在不使用带有索引的标准视图时增加应用程序性能。物化视图可以定期更新,可以通过触发器或使用ON COMMIT REFRESH
选项来更新。这需要一些额外的权限,但并不复杂。ON COMMIT REFRESH
自至少Oracle 10以来一直存在。
物化视图 - 存储在磁盘上的表格,包含查询结果集
非物化视图 - 从底层表中提取数据的查询
视图本质上是逻辑表格结构,由给定查询动态生成。视图查询的结果不会存储在磁盘上,每次执行查询时都会重新创建视图。物化视图是实际存储在数据库中并写入磁盘的结构。它们根据创建时定义的参数进行更新。
视图:视图只是一个命名查询,它不储存任何数据。当对视图进行查询时,它会运行视图定义中的查询语句,实际数据来自表。
物化视图:物化视图会将数据物理储存并定期更新。在查询物化视图时,它会返回物化视图中的数据。
在Mike McAllister详尽的回答上补充一下...
物化视图只能通过数据库检测到查询被编译器认为是简单的时,自动刷新。如果被认为太复杂,它将无法设置内部触发器来跟踪源表中的更改,以仅更新mview表中已更改的行。
当您创建一个物化视图时,您会发现Oracle同时创建了具有相同名称的mview 和表,这可能会让事情变得混乱。
物化视图是通过select查询驱动的逻辑数据视图,但查询结果将存储在表或磁盘中,查询定义也将存储在数据库中。
与普通视图相比,物化视图的性能更好,因为物化视图的数据将存储在表中,表可能被索引以便更快地进行连接操作。连接操作在物化视图刷新时完成,因此不需要像视图那样每次都发出连接语句。
其他区别包括,在视图中,我们总是获取最新的数据,但在物化视图中,我们需要刷新视图以获取最新的数据。 在物化视图中,我们需要一个额外的触发器或一些自动方法来保持MV刷新,这在数据库中的视图中是不需要的。