在不影响查询的情况下截断oracle mview

时间:2012-11-21 23:00:49

标签: oracle locking materialized-views

我在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。当我开始讨论分区切换时,我的团队负责人会感到紧张。 : - )

1 个答案:

答案 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_BASE1FOOBAR_MVIEW_DATA1_BASE2,以便物化视图刷新始终具有相同的起点(_BASE1有数据且_BASE2为空)或您可以编写刷新代码来检查同义词所指向的位置,并加载同义词未引用的任何表。