代码之家  ›  专栏  ›  技术社区  ›  Will

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

  •  1
  • Will  · 技术社区  · 14 年前

    我正在尽可能快地把记录从一个表复制到另一个表。

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

    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倍。

    2 回复  |  直到 14 年前
        1
  •  7
  •   Jeffrey Kemp    14 年前

    你的代码比简单的 INSERT + SELECT 是你保存异常,加上(正如贾斯汀指出的那样)你有一个毫无意义的 ORDER BY 这使得它做了很多毫无意义的工作。不管怎样,您没有任何代码可以对保存的异常执行任何操作。

    我只是把它作为 + 选择 .

        2
  •  0
  •   Bikrant Kumar Sahoo    8 年前