Oracle中的视图和物化视图有什么区别?
答案 0 :(得分:332)
物化视图基于磁盘,并根据查询定义定期更新。
视图仅为虚拟视图,每次访问时都会运行查询定义。
答案 1 :(得分:317)
他们在查询视图时评估视图定义下面的表中的数据。它是表的逻辑视图,没有其他地方存储数据。
视图的优点是始终会向您返回最新数据。视图的缺点是其性能取决于视图所基于的select语句的好坏程度。如果视图使用的select语句连接许多表,或者使用基于非索引列的连接,则视图可能表现不佳。
它们与常规视图类似,因为它们是数据的逻辑视图(基于select语句),但基础查询结果集已保存到表。这样做的好处是,当您查询实体化视图时,您正在查询表,该表也可能被编入索引。
此外,由于所有连接都已在物化视图刷新时解决,因此您需要支付连接的价格(或者在刷新实体化视图时),而不是每次从实体化视图中选择。此外,通过启用查询重写,Oracle可以优化从物化视图源中选择的查询,使其从物化视图中读取。如果您将实体化视图创建为聚合表的形式,或者作为频繁执行的查询的副本,则可以大大加快最终用户应用程序的响应时间。但是,的缺点是,从物化视图中返回的数据仅与上次刷新物化视图时的最新数据相同。
物化视图可以设置为在设定的时间表上手动刷新,或者基于数据库检测来自其中一个基础表的数据的变化。物化视图可以通过将它们与物化视图日志相结合来逐步更新,在基础表上充当变更数据捕获源。
物化视图最常用于数据仓库/商业智能应用程序,其中查询具有数千万行的大型事实表将导致查询响应时间,从而导致应用程序无法使用。
物化视图还有助于保证一致的时刻,类似于snapshot isolation。
答案 2 :(得分:47)
视图使用查询从基础表中提取数据。
物化视图是磁盘上包含查询结果集的表。
物化视图主要用于在不可行或不希望使用应用了索引的标准视图时提高应用程序性能。物化视图可以通过触发器或使用ON COMMIT REFRESH
选项定期更新。这确实需要一些额外的权限,但这并不复杂。至少从Oracle 10开始,ON COMMIT REFRESH
已经到位。
答案 3 :(得分:17)
视图本质上是由给定查询即时填充的逻辑表格式结构。视图查询的结果不会存储在磁盘上的任何位置,并且每次执行查询时都会重新创建视图。物化视图是存储在数据库中并写入磁盘的实际结构。它们根据创建时定义的参数进行更新。
答案 4 :(得分:16)
物化视图 - 磁盘上包含查询结果集的表
非重建视图 - 从基础表中提取数据的查询
答案 5 :(得分:2)
查看:视图只是一个命名查询。它不存储任何东西。当对视图有查询时,它会运行视图定义的查询。实际数据来自表格。
物化视图:物理存储数据并定期更新。在查询MV时,它会从MV中提供数据。
答案 6 :(得分:1)
加入Mike McAllister非常彻底的答案......
只有当编译器将视图查询视为简单时,才能通过检测更改的数据库将物化视图设置为自动刷新 。如果它被认为过于复杂,它将无法设置基本内部触发器来跟踪源表中的更改,只更新mview表中更改的行。
当你创建一个物化视图时,你会发现Oracle同时创建了mview 和一个同名的表,这会让事情变得混乱。
答案 7 :(得分:1)
视图只是一个SQL查询,获取查询的输出并使其看起来像一个虚拟表,它不占用任何存储空间或包含任何数据
但物化视图是架构对象,它将查询结果存储在单独的架构对象中(即占用存储空间并包含数据)。这表示物化视图返回表数据的物理上独立的副本
答案 8 :(得分:0)
材料化视图是由选择查询驱动的数据逻辑视图,但是查询结果将存储在表或磁盘中,查询的定义也将存储在数据库中。
物化视图的性能优于普通视图,因为物化视图的数据将存储在表中,并且表可能会被索引,因此联接的速度更快,并且在物化视图刷新时也会进行联接,因此无需每次触发连接语句时(视情况而定)。
其他区别包括在使用View的情况下,我们总是获取最新数据,但是在实现视图的情况下,我们需要刷新视图以获取最新数据。 对于实体化视图,我们需要一个额外的触发器或某种自动方法,以便我们可以保持MV的刷新,这对于数据库中的视图不是必需的。