4

我有一个巨大的物质化观点,我必须调整。这是一个简单的调整,因为我只是在 select 语句中添加了一个 NVL 函数。

即原...

Select this,
       that.....

即修改

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

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

这是一个问题,特别是因为我需要将其交付给客户,而他们无法运行 5 天以上的脚本来创建 MV。

问题:有什么方法可以加快MV的修改/重新制作速度?如果我更改 MV 会更快还是与删除和重新创建大致相同?

Oracle 版本 = 10g

4

2 回答 2

9

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

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

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

于 2011-05-18T15:57:10.140 回答
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)。这还将向您显示 Long Ops 进度(表扫描等)。

编辑:哦,顺便说一句,使用 nologging 构建 MV,一旦确定没有上述问题,总体上应该会有所帮助。

于 2011-05-18T16:39:54.373 回答