Oracle存在缓慢更新的地方

时间:2014-02-05 09:35:36

标签: oracle

我需要更新TableA ColC,其中ColD是'E'

TableA

自:

ColA | ColB | ColC | ColD
 A       B      C     D
 A       B      S     F
 A       B      X     E
 Z       Y      W     H

要:

ColA | ColB | ColC | ColD
 A       B      X     D
 A       B      X     F
 A       B      X     E
 Z       Y      W     H

我正在使用此

update tableA A
  set ColC = ( select ColC
               from   tableA B
               where  B.ColD = 'E'
               and    A.ColA = B.ColA
               and    A.ColB = B.ColB )
             where exist
             ( select 1
               from   tableA B
               where  B.ColD = 'E'
               and    A.ColA = B.ColA
               and    A.ColB = B.ColB )

总共需要更新400行。

问题是需要将近1分钟才能更新。

还有更有效的SQL要做更新吗?

2 个答案:

答案 0 :(得分:2)

在表tableA上为ColD,ColA,ColB列创建索引。

CREATE INDEX ix_tableA ON tableA (ColD, ColA, ColB);

答案 1 :(得分:1)

更新所有行可能会更快(如果Subselect不返回任何内容,则执行虚拟更新):

update tableA A
   set ColC = coalesce((select ColC
                         from tableA B
                        where B.ColD = 'E'
                          and A.ColA = B.ColA
                          and A.ColB = B.ColB),
                       ColC);