Optimization 在oracle中更新数百万行
我正在尝试更新500万行。下面的查询将在5-6分钟内运行。但我想定期提交500000条记录。我该怎么做 感谢您的帮助 谢谢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%
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万之后抛出错误,我也不会介意。