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

con*_*att 13 oracle materialized-views oracle10g

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

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

Jus*_*ave 17

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