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