2011-05-18 48 views
4

我有一个巨大的灵活视图,我必须调整。这是一个简单的调整,因为我只是将一个NVL函数添加到select语句中。Oracle - 物化视图alter structure so slow

I.e.原...

Select this, 
     that..... 

即使已修改

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

该查询需要26秒的时间才能运行,但由于检索到的行数(230万),死缓了。它连续运行了近5天,然后我停止了它。

这是一个问题,尤其是因为我需要将其交付给客户端,并且他们无法运行脚本超过5天以创建MV。

问题:有什么方法可以加快MV的改变/重建吗?如果我改变了MV,或者它会和删除和重新创建相同,会更快吗?

Oracle版本=10克

+0

你需要测试一下,但重新创建它的机会会更快(你触摸所有的行,这真是非常地狱)。 – Mat 2011-05-18 14:41:58

+2

“查询需要26秒才能运行”...您的意思是在26秒后启动返回行。尝试使用/ * + ALL_ROWS * /提示 – tbone 2011-05-18 16:29:47

回答

9

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

  1. 使用PRESERVE TABLE删除物化视图。
  2. 更新表中用于反映新列定义的MV中的数据。
  3. 使用ON PREBUILT TABLE子句重新创建物化视图。

如果在视图上有索引,禁用并重建它们可能会有所帮助。

+0

这个查询听起来像是一个好主意,我会尝试一下并让你知道结果 – contactmatt 2011-05-18 20:28:54

+0

这将起作用。非常感谢你:) – contactmatt 2011-05-23 17:48:54

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-> session browser)。这也会告诉你长时间的进步(桌面扫描等)。

编辑:哦,顺便说一句,建立MV使用nologging,应该有助于整体一旦你确定你没有上述问题。

+0

'不记录'会做什么? – contactmatt 2011-05-25 20:46:06

+0

如果你正在做一个完整的刷新,它会做一个截断...... insert/* + append * /。指定nologging后,它可以绕过表的重做生成(但仍会为索引生成一些)。这将大大减少(但不是消除)重做,你应该看到它的性能提升(在完全重建中)。 – tbone 2011-05-26 11:30:55