Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle批量提取和FORALL插入的性能问题_Oracle_Plsql_Query Optimization_Bulkinsert - Fatal编程技术网

Oracle批量提取和FORALL插入的性能问题

Oracle批量提取和FORALL插入的性能问题,oracle,plsql,query-optimization,bulkinsert,Oracle,Plsql,Query Optimization,Bulkinsert,我正试图尽可能快地将记录从一个表复制到另一个表 目前,我有一个简单的光标循环,类似于: FOR rec IN source_cursor LOOP INSERT INTO destination (a, b) VALUES (rec.a, rec.b) END LOOP; 我想加快速度,使其达到超快,因此我尝试了一些批量操作—批量提取,然后是FORALL插入: 以下是我为批量选择/全选插入所做的准备 DECLARE TYPE t__event_rows IS TABLE OF _e

我正试图尽可能快地将记录从一个表复制到另一个表

目前,我有一个简单的光标循环,类似于:

FOR rec IN source_cursor LOOP
   INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
我想加快速度,使其达到超快,因此我尝试了一些批量操作—批量提取,然后是FORALL插入:

以下是我为批量选择/全选插入所做的准备

DECLARE 
  TYPE t__event_rows IS TABLE OF _event%ROWTYPE;
  v__event_rows t__event_rows;

  CURSOR c__events IS
    SELECT * FROM _EVENT ORDER BY MESSAGE_ID;
BEGIN
  OPEN c__events;
  LOOP
    FETCH c__events BULK COLLECT INTO v__event_rows LIMIT 10000;  -- limit to 10k to avoid out of memory

    EXIT WHEN c__events%NOTFOUND;

    FORALL i IN 1..v__event_rows.COUNT SAVE EXCEPTIONS
      INSERT INTO destinatoin
        ( col1, col2, a_sequence) 
        VALUES 
        (  v__event_rows(i).col1,  v__event_rows(i).col2, SOMESEQEUENCE.NEXTVAL );


  END LOOP;
  CLOSE c__events;


END;
我的问题是,到目前为止,我还没有看到任何大的性能提升。据我所知,它应该快10-100倍


我是否在这里遗漏了一个瓶颈?

与简单的插入+选择相比,您的代码的唯一好处是可以保存异常,而且正如Justin指出的那样,您有一个毫无意义的顺序,通过它可以完成大量无意义的工作。无论如何,您没有任何代码来处理保存的异常


我只是将其实现为插入+选择。

与简单的插入+选择相比,您的代码的唯一好处是可以保存异常,而且正如Justin指出的那样,您有一个毫无意义的顺序,通过这个顺序,它可以做大量无意义的工作。无论如何,您没有任何代码来处理保存的异常



我只是将其实现为插入+选择。

在编码本身需要循环之前,您不必不必要地使用循环。

在编码本身需要循环之前,您不必不必要地使用循环。

对于100000行,大约需要300!即使批量插入,也需要几秒钟。您的选择中是否有订单?对100000行进行排序可能相当昂贵,而且似乎没有必要这样做。另外,您的%NOTFOUND检查需要在FORALL之后进行-否则,如果您在上一次迭代中获取的行少于10000行,您将不会插入这些行。谢谢!我会取消订单的,但我不认为它会让我相当的速度,我期待。。。我将尝试获取tkprof分析,并在稍后更新。%notfound捕捉得很好目标表中是否有触发器?另外,如果只是将数据从一个表复制到另一个表,是否可以使用SQL语句而不是PL/SQL?请注意:对于100000行,大约需要300!即使批量插入,也需要几秒钟。您的选择中是否有订单?对100000行进行排序可能相当昂贵,而且似乎没有必要这样做。另外,您的%NOTFOUND检查需要在FORALL之后进行-否则,如果您在上一次迭代中获取的行少于10000行,您将不会插入这些行。谢谢!我会取消订单的,但我不认为它会让我相当的速度,我期待。。。我将尝试获取tkprof分析,并在稍后更新。%notfound捕捉得很好目标表中是否有触发器?另外,如果您只是将数据从一个表复制到另一个表,是否可以使用SQL语句而不是PL/SQL?请注意:您可以在INSERT上使用LOG ERRORS子句来保存异常。您可以在INSERT上使用LOG ERRORS子句来保存异常。这应该是一条注释,不是答案。是的,但是代码需要一些技巧来解决更好的性能问题。是的,这就是为什么它应该是注释:这应该是注释,而不是答案。是的,但是代码需要一些技巧来解决更好的性能问题。是的,这就是为什么它应该是注释: