Optimization 在oracle中更新数百万行

Optimization 在oracle中更新数百万行,optimization,plsql,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%

我正在尝试更新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;
/

你可能会做类似的事情

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;
/

你可能会做类似的事情

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;
/

既然您已经标记了这个“优化”,我假设您关心性能。虽然您可以在PL/SQL中重写SQL,使用循环并每n次迭代提交一次,但这会降低您的速度

事实上,更新数百万行的最快方法通常是根本不更新。而是创建一个新表创建表。。。像选择,删除旧表,然后重命名新表。它减少了重做和撤消的次数,并大大提高了性能


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

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

事实上,更新数百万行的最快方法通常是根本不更新。而是创建一个新表创建表。。。像选择,删除旧表,然后重命名新表。它减少了重做和撤消的次数,并大大提高了性能


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

这只是一个名称更改,所以即使它在500万之后抛出错误,我也不会介意。这只是一个名称更改,所以即使它在500万之后抛出错误,我也不会介意。