我在一个 Oracle 11g 数据库中有几个 MV,它们在非原子时会迅速完全刷新。一个新的要求意味着他们必须是。
我知道当非原子 DBMS_MVIEW.REFRESH 在一系列插入之前执行截断但是当 atomic => true 时,所有记录都首先被删除。仅删除记录需要一个多小时,而非原子版本只需几分钟。
我需要一种方法来允许对这个 MV 的查询在我刷新它时继续。FAST 刷新方法是不可能的,因为 MV 查询使用计数并且大多数记录无论如何都会有变化。
所以,我想出的结构是这样的:
LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE;
SELECT * FROM FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2;
COMMIT;
和
LOCK TABLE FOOBAR_MVIEW_LOCK IN EXCLUSIVE MODE;
EXECUTE DBMS_MVIEW.REFRESH( 'FOOBAR_MVIEW_DATA1,FOOBAR_MVIEW_DATA2','cc');
COMMIT;
有没有更好的办法?注意。当我开始谈论分区切换时,我的组长很紧张。:-)