ChatGPT解决这个技术问题 Extra ChatGPT

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

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


W
WAF

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

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


此外,当您需要对不需要及时更新的数据的性能时,物化视图会更好,但您的数据会比标准视图中的数据更旧。通常 BI 报告会从物化视图中获得很多好处。
@Marthinus - 这是正确的,除了在 REFRESH ON COMMIT 的物化视图的情况下 - MV 将准确返回已提交的数据。
DISK based是什么意思?这是否意味着表不是磁盘的一部分?它是否存储在文件中并且磁盘访问比文件访问...更快?
@KanagaveluSugumar 是的,实际的表也写入磁盘。
@dacracot 谢谢!我认为您的意思是说磁盘中的数据库表除外;这个 MVIEW 还通过解析所有连接来维护一个表。这样在运行时单表访问就足够了;并且不需要查询多个表的连接条件,这通常由普通视图完成。谢谢!
3
3 revs, 2 users 55%

意见

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

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

物化视图

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

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

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

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

物化视图也有助于确保时刻的一致,类似于 snapshot isolation


+1 详细说明,但查询重写的缺点是什么?如果查询重写将允许 Oracle 进一步优化查询,那么我们应该始终启用查询重写,不是吗?
@Rosdi,他说:“您从物化视图返回的数据仅与上次刷新物化视图时一样最新”
@Mike thx u,有没有一本书或课程解释了如何自动化这个物化视图复习?
@ERJAN,我不确定是否有专门针对此的书或课程。但我只会使用可以在后台运行的守护进程或类似的东西。我还怀疑特定的数据库引擎有特定的方式来运行预定的作业。
@ERJAN Here 是一些选项
J
Jeremiah Peschka

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

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

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


可以在物化视图上指定“REFRESH ON COMMIT”选项
谢谢!我会更新答案。您知道此功能何时添加到 Oracle 中吗?
f
fn27

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

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


u
user12786

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


DISK based是什么意思?这是否意味着表不是磁盘的一部分?它是否存储在文件中并且磁盘访问比文件访问...更快?
s
smshafiqulislam

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

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


S
Stew S

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

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

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


支持物化视图的表不采用与视图相同的名称。
@JeffreyKemp,你确定吗?此处接受的答案 stackoverflow.com/a/33552513 另有声明。虽然是的,但在 2010 年您发表评论时,情况可能有所不同……
我上面的评论一定是在旧版本上(可能是 9i)。你是对的,至少在现代版本中,MV 会得到一个同名的表。
D
Dhirendra Gautam

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

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

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