我有一个Oracle 11g数据库中的几个MV,当它不是原子时,它可以很快地完全刷新。 新的要求意味着它们必须是。在不影响查询的情况下截断oracle mview
我知道,当非原子DBMS_MVIEW.REFRESH在一系列插入操作之前执行截断操作,但是当atomic => true时,所有记录都会先被逐个删除。只需删除记录需要一个多小时,而非原子版本只需几分钟。
我需要一种方法来允许对这个MV的查询继续,而我刷新它。 FAST刷新方法不存在问题,因为MV查询使用计数,并且mosts记录无论如何都会有变化。
所以,我拿出结构是这样的:
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;
有没有更好的办法? NB。当我开始谈论分区切换时,我的团队领导变得紧张。 :-)
我不确定我是否理解你已经提出的构造,如何帮助解决问题,显式锁提供了什么好处,或者在两者之间做了笛卡尔连接的查询有什么作用表有。您能否详细介绍一下提议的解决方案? –
查询不是真正的查询,只是为了显示构造。 这个想法是有一个进程执行查询和另一个执行刷新。 由于每个会话都被迫等待另一个放弃锁定,所以其中只有一个会话在任何时候都有控制权。 –
因此,只有一个会话运行查询? –