12

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

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

4

1 回答 1

17

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

于 2011-08-09T17:23:16.180 回答