Oracle - 物化视图改变结构如此之慢

时间:2011-05-18 14:37:41

标签: oracle oracle10g materialized-views

我有一个巨大的毁灭性视图,我必须调整。这是一个简单的调整,因为我只是将一个NVL函数添加到select语句中。

即。原始...

Select this,
       that.....

即。修改

Select NVL(this, orThat) as this,
       NVL(That, orThis) as that

查询需要26秒才能运行,但由于检索到的行数(230万),它的速度很慢。它连续运行了将近5天,然后我停了下来。

这是一个问题,特别是因为我需要将它传递给客户端,并且他们无法运行脚本5天以上来创建MV。

问题:有没有办法加快改变/重建MV?如果我改变了MV还是与丢弃和重新创建一样的话会更快吗?

Oracle版本= 10g

2 个答案:

答案 0 :(得分:9)

您无法更改实体化视图的查询定义 - 您必须删除并重新创建它。也就是说,您可以尝试这种方法,它可能比重新创建整个MV更快:

  1. 使用PRESERVE TABLE。
  2. 删除物化视图
  3. 更新曾经是MV的表中的数据,以反映新的列定义。
  4. 使用ON PREBUILT TABLE子句重新创建物化视图。
  5. 如果视图上有索引,则禁用和重建它们可能会有所帮助。

答案 1 :(得分:1)

5天以上建立一个2-3百万行的MV?多数情况下,这太糟糕了,不仅仅是糟糕的SQL。我的猜测是你可能会被其他一些进程阻止(?)。不确定,但在启动MV重建后从另一个会话中检查:

select s1.username || '@' || s1.machine
  || ' ( SID=' || s1.sid || ' )  is blocking '
  || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
  from v$lock l1, v$session s1, v$lock l2, v$session s2
  where s1.sid=l1.sid and s2.sid=l2.sid
  and l1.BLOCK=1 and l2.request > 0
  and l1.id1 = l2.id1
  and l2.id2 = l2.id2 ;

只是一个猜测。如果您使用Toad,您也可以获得此信息(通过Database-> monitor->会话浏览器)。这也将显示Long Ops进度(表扫描等)。

编辑:哦,顺便说一下,使用nologging来构建MV,一旦你确定你没有上述问题就应该有所帮助。