问题 Oracle - 物化视图在完全刷新期间仍可访问。这个怎么用?


在我们的一个应用程序中,我们有一个庞大的物化视图,每天刷新三次,需要七个小时才能刷新。 (不太理想,我知道)。这让我很困惑,因为我确实认为用户和会话在刷新时无法访问这个物化视图,但显然他们可以! (刷新的类型是 完成 刷新)

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


1659
2017-08-09 17:02


起源

我相信这会被称为:读一致视图。这意味着,无论何时修改行,原始行都会保留,直到事务结束,以防某人查询该表。 - Randy


答案:


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


15
2017-08-09 17:23



很好的答案,谢谢! - contactmatt
你可以简单地通过声明视图来选择原子或非原子方式吗? - MihaiS