Oracle - 物化视图在完全刷新期间仍可访问。这是如何运作的?

Posted

技术标签:

【中文标题】Oracle - 物化视图在完全刷新期间仍可访问。这是如何运作的?【英文标题】:Oracle - Materialized View still accessible during complete refresh. How does this work? 【发布时间】:2011-10-23 10:03:14 【问题描述】:

在我们的一个应用程序中,我们有一个巨大的物化视图,每天刷新 3 次,刷新需要 7 个小时。 (不理想,我知道)。这让我感到困惑,因为我当然认为用户和会话在刷新时无法访问这个物化视图,但显然他们可以! (刷新的类型是完全刷新)

据我了解,在完全刷新期间,现有数据集将被删除,然后重新执行查询。如果这是真的,那么用户/其他会话如何在物化视图刷新时访问物化视图

【问题讨论】:

我相信这将被称为:读取一致视图。这意味着,每当修改一行时,原始行都会保持原样,直到事务结束,以防有人查询该表。 【参考方案1】:

完全刷新有两种不同的方式——原子刷新或非原子刷新。原子刷新只需发出 DELETE 以删除物化视图中的所有行,然后执行 INSERT 以插入新数据。这一切都在一个事务中,因此 Oracle 的标准多版本读取一致性架构允许 Oracle 向其他会话显示旧数据,直到刷新完成。在非原子刷新中,Oracle 对物化视图执行 TRUNCATE,然后执行直接路径 INSERT 以插入新数据。这实际上效率更高,但由于 TRUNCATE 是 DDL,这意味着旧数据在刷新期间对其他会话不可见。

【讨论】:

你可以简单地通过声明视图来选择原子或非原子方式吗? 不,没有这样的方法可以专门选择这样的更新 如何理解刷新是原子的还是非原子的?以及如何在刷新时测试对 MV 的访问? @MicheleCordini - 如果您使用dbms_mview.refresh 过程刷新实体化视图,atomic_refresh 是一个参数。 docs.oracle.com/database/121/ARPLS/d_mview.htm#ARPLS67203 至于测试,只需要在刷新进程运行的同时在单独的会话中查询物化视图即可。

以上是关于Oracle - 物化视图在完全刷新期间仍可访问。这是如何运作的?的主要内容,如果未能解决你的问题,请参考以下文章

物化视图快速刷新 - 更新基表时插入和删除

oracle物化视图不会自动更新是怎么回事

如何防止物化视图在 pg_restore 期间刷新?

Oracle设置物化视图的自动刷新

解决oracle 物化视图刷新失败

oracle如何刷新物化视图