Oracle BULK FETCH和FORALL插入的性能问题

Wil*_*ill 1 oracle plsql bulkinsert query-optimization

我试图尽快将记录从一个表复制到另一个表.

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

FOR rec IN source_cursor LOOP
   INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;
Run Code Online (Sandbox Code Playgroud)

我想加快它的速度,所以我正在尝试一些BULK操作(BULK FETCH,然后是FORALL插入):

这是我对批量选择/ 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;
Run Code Online (Sandbox Code Playgroud)

我的问题是到目前为止我没有看到任何大的性能提升.从我读到的它应该快10倍-100倍.

我在这里错过了一个瓶颈吗?

Jef*_*emp 7

你的代码对一个简单的INSERT+ 唯一的好处SELECT就是你保存了异常,而且(正如Justin指出的那样)你有一个无意义的东西ORDER BY,它使它做了很多毫无意义的工作.然后,您没有任何代码可以对保存的异常执行任何操作.

我只是将其实现为INSERT+ SELECT.

  • 您可以在INSERT上使用LOG ERRORS子句来保存异常. (2认同)