在我们的一个应用程序中,我们有一个庞大的物化视图,每天刷新三次,需要七个小时才能刷新。 (不太理想,我知道)。这让我很困惑,因为我确实认为用户和会话在刷新时无法访问这个物化视图,但显然他们可以! (刷新类型是完整刷新)
在完全刷新期间,根据我的理解,删除现有数据集,然后重新执行查询。如果是这样,那么在刷新实体化视图时,用户/其他会话如何能够访问实体化视图?
答案 0 :(得分:16)
完全刷新有两种不同的方式 - 原子刷新或非原子刷新。原子刷新只是发出DELETE来删除实例化视图中的所有行,然后执行INSERT以插入新数据。这一切都在一个事务中,因此Oracle的标准多版本读取一致性体系结构允许Oracle向其他会话显示旧数据,直到刷新完成。在非原子刷新中,Oracle在物化视图上执行TRUNCATE,然后在直接路径INSERT中插入新数据。这实际上更有效,但由于TRUNCATE是DDL,这意味着在刷新期间旧数据对其他会话不可见。