如何改进此更新脚本?

时间:2013-08-15 08:32:04

标签: oracle oracle11g sql-update

我想更新oracle中有155.750行的表。 我写这个:

 UPDATE Table1 R
SET R.TOTAL = 
(SELECT SUM(T.TOTALS_TO_DATE)
FROM Table2 T
WHERE T.ID= R.ID
AND T.TYPE = 'type5');

表1的索引位于ID 表2的索引位于IDTYPE。 这没有回应。如何编辑它才能快速运行?

如果我写这个选择它会快速运行。

 SELECT SUM(T.TOTALS_TO_DATE),R.ID
    FROM Table2 T,Table1 R
    WHERE T.ID= R.ID
    AND T.TYPE = 'type5' 
  group by R.ID ;

这会运行,但我不明白为什么更新脚本需要3000秒。

感谢。

2 个答案:

答案 0 :(得分:2)

尝试使用MERGE声明

MERGE INTO table1 R using
( SELECT SUM(T.TOTALS_TO_DATE) S, T.ID
    FROM Table2 T
    WHERE T.TYPE = 'type5' 
  group by T.ID 
) T
ON ( R.ID = T.ID)
WHEN MATCHED THEN UPDATE SET R.TOTAL = T.S
;

答案 1 :(得分:1)

您忘记将where条件放在更新脚本中。因此它正在更新整个table1,因此需要时间。

对于select查询,您提到了运行速度更快的where子句。

编辑: -

查看我们的link

以下是一些可以更快地提高更新命令的步骤。

  1. 删除要更新的列的索引。
  2. 以较小批量执行更新。
  3. 禁用删除触发器。
  4. 使用批量插入操作替换Update语句。