在游标中执行插入的最佳实践

Neo*_*net 1 oracle plsql

我需要在游标中插入大约300000行的一些插入,然而这运行得很慢,有关如何让它运行得更快的任何想法?我可以通过批量提交加快速度吗?所以例如我会在第1000行之后执行提交

DECLARE

  CURSOR test_cursor IS 
    SELECT a from database.mytable
BEGIN

  FOR curRow IN test_cursor LOOP

    insert into tableb (testval)
    values ('something');

  commit;

  END LOOP;
END; 
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 9

300000行不是那么多行.除非每行都非常大,否则不应在批处理中间提交.

中间提交只会实现:

  • 额外开销因为每次提交都会产生额外的工
  • 在出现错误(以及失去事务完整性)的情况下失去可重启性,
  • 更有可能遇到ORA-1555

如果你的进程实际上是一个在循环中有一个插入的游标,你应该运行一个语句:

BEGIN
   INSERT INTO tableb (col1..coln) (SELECT col1..coln FROM database.mytable);
END;
Run Code Online (Sandbox Code Playgroud)

如果您仍然需要额外的性能,可以考虑直接插入和并行操作,但可能是"仅"300k行的过度优化.

到目前为止,您可以使用的最大优化是根据集合进行思考,而不是由批量单行语句组成的传统过程方法.