【问题标题】:Oracle - Materialized View alter structure so slowOracle - 物化视图改变结构如此缓慢
【发布时间】:2011-08-28 03:19:28
【问题描述】:

我有一个巨大的实体化视图,我必须进行调整。这是一个简单的调整,因为我只是在 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

【问题讨论】:

  • 您需要对其进行测试,但重新创建它的速度可能会更快(您正在触摸所有行,这简直是地狱)。
  • “查询需要 26 秒才能运行”...您的意思是它在 26 秒后开始返回行。使用 /*+ ALL_ROWS */ 提示尝试该查询

标签: oracle oracle10g materialized-views


【解决方案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,一旦确定没有上述问题,总体上应该会有所帮助。

【讨论】:

  • 如果你在做一个完整的刷新,它会做一个截断...insert/*+append*/。指定 nologging,它可以绕过表的重做生成(但仍会为索引生成一些)。这将大大减少(但不会消除)重做,并且您应该会看到性能提升(在完全重建中)。
【解决方案2】:

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

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

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

【讨论】:

  • 这听起来是个好主意,我会尝试并告诉你结果
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2021-10-11
  • 1970-01-01
  • 2011-04-06
  • 2023-03-08
  • 2012-07-17
相关资源
最近更新 更多