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

427

在Oracle中,视图(Views)和物化视图(Materialized Views)有什么区别?

8个回答

443

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

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


70
如果您需要处理不需要准确到秒的数据时,物化视图会更好,但是您的数据会比标准视图旧。通常情况下,物化视图对BI报告会带来很大的好处。 - Marthinus
35
@Marthinus - 除了在材料化视图是REFRESH ON COMMIT的情况下,这是正确的 - MV将返回已提交的确切数据。 - Jeffrey Kemp
4
DISK based是什么意思?它是否表示表不是DISK的一部分?它存储在文件中,而DISK访问比文件访问更快吗……? DISK based指的是数据存储在硬盘上。这并不意味着表不是硬盘的一部分,而是表示数据存储在硬盘文件中。与文件访问相比,通过硬盘访问数据速度更快。 - Kanagavelu Sugumar
2
@KanagaveluSugumar 是的,实际表也会写入磁盘。 - dacracot
7
@dacracot 感谢您!我想您的意思是除了磁盘中的数据库表,这个 MVIEW 也通过解析所有联接来维护一张表。因此在运行时只需要访问单个表,无需查询多个表以满足联接条件,这通常由普通视图完成。谢谢! - Kanagavelu Sugumar
显示剩余3条评论

392

视图

视图在查询时会评估底层表中的数据{{,}}是您表的逻辑视图,没有任何数据存储在其他地方。

视图的好处是它将始终向您返回最新的数据{{;}}视图的缺点在于其性能取决于视图所基于的选择语句的好坏。如果视图使用的选择语句连接了许多表或使用了基于非索引列的连接,则视图的性能可能很差。

物化视图

它们类似于常规视图{{,}}因为它们是根据选择语句创建的数据的逻辑视图,但是{{,}}底层查询结果集已经保存到一个表中。这样做的好处是当您查询物化视图时{{,}}您正在查询一个表{{,}}该表也可以建立索引。

此外,由于所有连接都在物化视图刷新时解析,因此您只需支付一次连接的代价(或者在刷新物化视图时频繁进行),而不是每次从物化视图中选取时。此外,启用查询重写后,Oracle 可以优化从物化视图源中选取的查询,使其改为从物化视图读取。在创建物化视图作为聚合表单或频繁执行的查询副本的情况下,这可以大大加快最终用户应用程序的响应时间。{{但缺点是您从物化视图中获取的数据只有在上次刷新物化视图时才是最新的}}。


材料化视图可以手动刷新、按照设定的时间表刷新,或者基于数据库检测到底层表中数据发生变化而进行刷新。通过与材料化视图日志相结合,材料化视图可以进行增量更新,材料化视图日志充当底层表上的变更数据捕获源。
在数据仓库/商业智能应用程序中,通常使用材料化视图,在这些应用程序中,查询具有数千万行记录的大型事实表将导致查询响应时间过长,从而导致无法使用的应用程序。

物化视图还有助于保证与快照隔离类似的一致时间点。


10
+1 对于详细的解释,但是查询重写有什么缺点吗?如果查询重写可以让 Oracle 进一步优化查询,那我们应该始终启用查询重写,不是吗? - Rosdi Kasim
8
@Rosdi,他说:"你从物化视图中获取的数据只有在最后一次刷新物化视图时才是最新的。" - Jeffrey Kemp
1
@Mike 谢谢你,有没有一本书或课程可以解释如何自动化这个物化视图刷新器? - ERJAN
1
@ERJAN,我不确定是否有专门针对此问题的书籍或课程。但我会使用一个可以在后台运行的_daemon_或类似的东西。我还怀疑特定的数据库引擎有特定的运行计划任务的方式。 - Mike Williamson
1
@ERJAN 这里有一些选项:https://dev59.com/DV0b5IYBdhLWcg3wO_I_#29447328 - vpalmerini

66

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

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

物化视图主要用于在不使用带有索引的标准视图时增加应用程序性能。物化视图可以定期更新,可以通过触发器或使用ON COMMIT REFRESH选项来更新。这需要一些额外的权限,但并不复杂。ON COMMIT REFRESH自至少Oracle 10以来一直存在。


2
可以在物化视图上指定“提交时刷新”选项。 - Hybris95
1
谢谢!我会更新答案。你知道这个功能是什么时候加入Oracle的吗? - anon

27

物化视图 - 存储在磁盘上的表格,包含查询结果集

非物化视图 - 从底层表中提取数据的查询


25

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


1
DISK based的意思是什么?这是否意味着表不是DISK的一部分?它是存储在文件中的,而且DISK访问比文件访问更快吗……? - Kanagavelu Sugumar

14

视图:视图只是一个命名查询,它不储存任何数据。当对视图进行查询时,它会运行视图定义中的查询语句,实际数据来自表。

物化视图:物化视图会将数据物理储存并定期更新。在查询物化视图时,它会返回物化视图中的数据。


5

在Mike McAllister详尽的回答上补充一下...

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

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


1
支持物化视图的表与视图名称不相同。 - Jeffrey Kemp
1
@JeffreyKemp,你确定吗?这里https://dev59.com/4lwX5IYBdhLWcg3wpw1h#33552513的被接受答案声称不同。尽管是的,在你评论的2010年可能是不同的... - leqid
1
我之前的评论可能是针对较旧的版本(可能是9i)。你说得对,在现代版本中,MV会获得一个具有相同名称的表。 - Jeffrey Kemp

5

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

与普通视图相比,物化视图的性能更好,因为物化视图的数据将存储在表中,表可能被索引以便更快地进行连接操作。连接操作在物化视图刷新时完成,因此不需要像视图那样每次都发出连接语句。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接