0

我在一个 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;

有没有更好的办法?注意。当我开始谈论分区切换时,我的组长很紧张。:-)

4

1 回答 1

0

您注意到当您开始谈论分区切换时,您的团队负责人很紧张。这是否表明您已获得分区选项的许可,因此如果我们能够解决团队负责人的任何问题,这将是可能的吗?或者这是否表明我们应该放弃该选项?

如果分区切换不是一种选择,则方法是使用同义词,将指向一个表(或物化视图)的同义词翻转到另一个表。所以,例如

  • 重命名FOOBAR_MVIEW_DATA1FOOBAR_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
  • 在未来某个时间点,当现有查询全部完成时,您可以 truncate FOOBAR_MVIEW_DATA1_BASE1。您可以选择重命名FOOBAR_MVIEW_DATA1_BASE1FOOBAR_MVIEW_DATA1_BASE2以便您始终拥有相同的物化视图刷新起点(_BASE1有数据且_BASE2为空),或者您可以编写刷新代码来检查同义词指向的位置并加载任何不指向的表被同义词引用。
于 2012-11-21T23:17:01.607 回答