在oracle中更新数百万行

时间:2016-06-08 20:10:16

标签: optimization plsql

我正在尝试更新500万行。以下查询在5-6分钟内运行。但我希望在500000条记录之间定期提交。我该怎么做?

感谢任何帮助。

谢谢

DECLARE
   a   NUMBER;
   BEGIN
   UPDATE table1
    SET (name) =
         (SELECT name
            FROM table1
           WHERE     a1= 24672

   WHERE ROWNUM <= 6500000;

   a := SQL%ROWCOUNT;
   DBMS_OUTPUT.put_line (a || ' Rows Updated');
END;
/

2 个答案:

答案 0 :(得分:1)

由于您已标记此“优化”,我认为您关心的是性能。虽然您可以在PL / SQL中重写SQL,但是使用循环并提交每n次迭代,这会降低您的速度。

更新数百万行的最快方法通常实际上根本不更新。而是创建一个新表(CREATE TABLE ... AS ... SELECT),删除旧表,然后重命名新表。它减少了重做和撤消的数量,并大大加快了性能。

请参阅How to update millions of rows

如果性能足够好,那么你可能不再关心部分提交了吗?

答案 1 :(得分:0)

你可能会做类似的事情。

DECLARE
   a   NUMBER;
   commitCt NUMBER;
   rowCt NUMBER;

   BEGIN
      LOOP
         commitCt := 0;
         rowCt := 0;
         SAVEPOINT svePoint;

     WHILE rowCt/500000 <= 1
     LOOP
       BEGIN
           rowCt := rowCt + 1;



           commitCt := commitCt + 1;

       EXCEPTION
         WHEN OTHERS THEN
           ROLLBACK to svePoint;
       END;

      END LOOP;

     COMMIT;

     IF commitCt = 0 THEN
        EXIT;
     END IF;

      END LOOP;
END;
/