2012-11-21 45 views
0

我有一个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。当我开始谈论分区切换时,我的团队领导变得紧张。 :-)

+0

我不确定我是否理解你已经提出的构造,如何帮助解决问题,显式锁提供了什么好处,或者在两者之间做了笛卡尔连接的查询有什么作用表有。您能否详细介绍一下提议的解决方案? –

+0

查询不是真正的查询,只是为了显示构造。 这个想法是有一个进程执行查询和另一个执行刷新。 由于每个会话都被迫等待另一个放弃锁定,所以其中只有一个会话在任何时候都有控制权。 –

+0

因此,只有一个会话运行查询? –

回答

0

你注意到当你开始谈论分区切换时,你的团队负责人感到紧张。这是否表明您已经获得了分区选项的许可?如果我们可以解决团队领导的任何问题,这将是一种可能性?或者这是否表明我们应该放弃这一选择?

如果分区切换不是一个选项,那么这种方法会有一个同义词,您可以从指向一个表(或物化视图)的另一个表中翻转。因此,例如

  • 重命名FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE1
  • 创建一个同义词FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE1
  • 创建一个空表FOOBAR_MVIEW_DATA1_BASE2,其结构为FOOBAR_MVIEW_DATA1_BASE1
  • 当你想刷新物化视图一样,将数据插入FOOBAR_MVIEW_DATA1_BASE2并在预建表上创建实体化视图。
  • 一旦数据被刷新,点代名词FOOBAR_MVIEW_DATA1FOOBAR_MVIEW_DATA1_BASE2
  • 在当现有的查询都是完整的未来的某个时刻,你可以截断FOOBAR_MVIEW_DATA1_BASE1。并且您可以选择重命名FOOBAR_MVIEW_DATA1_BASE1FOOBAR_MVIEW_DATA1_BASE2,以便您始终可以在物化视图刷新(_BASE1有数据且_BASE2为空)时始终具有相同的起点,或者可以编写刷新代码以检查同义词指向的位置并加载任何表未被同义词引用。
+0

我相信原因是我们只有生产数据库有分区切换,所以开发和测试都是有问题的。你的同义词的想法已经被考虑过了,但是有2个MV,我不确定是否他们之间的不一致会被接受。我在上面的示例中简化了一些东西,但实际上有两个查询检索不同但相关的数据。结果需要匹配。如果我能说服我的TL使用分区交换,它能解决这个问题吗? –

+0

纠正;这是一个连接两个MV的查询。 –

相关问题