Oracle Update on View极其缓慢

时间:2014-10-08 18:25:40

标签: sql oracle

我有这个简单的UPDATE声明:

  UPDATE   v_my_view mv
     SET   mv.name   = 
              (SELECT   RTRIM(name)
                 FROM   v_another_view av
                WHERE av.KEY_ID = mv.KEY_ID)
   WHERE mv.VALID = 1;

此语句需要很长时间(20秒),而同一视图上的其他更复杂的更新只需不到1秒。首先我认为它是RTRIM函数,但它不是,如果我不使用它,它就像以前一样慢。

两个视图上的SELECT都会非常快速地返回记录。

视图上没有TRIGGER,但桌子后面有一个。但它不能成为瓶颈,因为即使我对所有TRIGGER代码进行评论,它也会有相同的缓慢性能。

有人有建议吗?

编辑:添加了缺少的WHERE子句 编辑:视图(或后面的表)每个只包含8000条记录,没有特殊的数据类型。

3 个答案:

答案 0 :(得分:0)

您正在更新整个视图而没有任何WHERE子句。

如果您有大量数据甚至索引,可能会减慢您的操作速度。

答案 1 :(得分:0)

name的基础表中的列v_my_view上是否有任何索引?如果是,请禁用它们,看看它是否会导致对查询性能的任何改进。 正如Nick.McDermaid所说,如果没有执行计划和等待事件统计数据,很难说。你可以期待的最好的是某种形式的心灵调试。

答案 2 :(得分:0)

merge --+ use_hash(MV,AV) no_merge(AV) no_merge(MV)
    into (select * from v_my_view MV where valid = 1)
using v_another_view AV
on MV.key_id = AV.key_id
when matched then
    update
    set MV.name = rtrim(AV.name)
;

虽然我并不完全确定merge进入内嵌视图,但您至少可以尝试一下(如果不起作用则发表评论)。

此外,最好显示查询的执行计划以及查询。