我在Oracle 11g数据库中有几个MV,当非原子时,它会快速完全刷新。 新要求意味着它们必须是。
据我所知,当非原子DBMS_MVIEW.REFRESH在一系列插入之前执行截断但是当atomic =>时确实首先删除所有记录。只删除记录需要一个多小时,而非原子版只需几分钟。
我需要一种方法来允许在刷新它时继续查询此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;
有更好的方法吗? NB。当我开始讨论分区切换时,我的团队负责人会感到紧张。 : - )
答案 0 :(得分:0)
您注意到当您开始讨论分区切换时,您的团队负责人会感到紧张。这是否表明您已获得分区选项的许可,这样如果我们能解决团队领导的任何问题,这是可能的?或者这是否表明我们应该放弃该选项?
如果分区切换不是一个选项,那么方法是将一个同义词从指向一个表(或物化视图)翻转到另一个表。所以,例如
FOOBAR_MVIEW_DATA1
重命名为FOOBAR_MVIEW_DATA1_BASE1
FOOBAR_MVIEW_DATA1
FOOBAR_MVIEW_DATA1_BASE1
FOOBAR_MVIEW_DATA1_BASE2
FOOBAR_MVIEW_DATA1_BASE1
FOOBAR_MVIEW_DATA1_BASE2
并在预建表上创建物化视图。FOOBAR_MVIEW_DATA1
指向FOOBAR_MVIEW_DATA1_BASE2
FOOBAR_MVIEW_DATA1_BASE1
。您可以选择重命名FOOBAR_MVIEW_DATA1_BASE1
和FOOBAR_MVIEW_DATA1_BASE2
,以便物化视图刷新始终具有相同的起点(_BASE1
有数据且_BASE2
为空)或您可以编写刷新代码来检查同义词所指向的位置,并加载同义词未引用的任何表。