我有一个巨大的毁灭性视图,我必须调整。这是一个简单的调整,因为我只是将一个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
答案 0 :(得分:9)
您无法更改实体化视图的查询定义 - 您必须删除并重新创建它。也就是说,您可以尝试这种方法,它可能比重新创建整个MV更快:
如果视图上有索引,则禁用和重建它们可能会有所帮助。
答案 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,一旦你确定你没有上述问题就应该有所帮助。