簡體   English   中英

Oracle BULK FETCH和FORALL插入的性能問題

[英]Performance problem with Oracle BULK FETCH and FORALL insert

我正在嘗試盡快將記錄從一個表復制到另一個表。

目前,我有一個與此類似的簡單光標循環:

FOR rec IN source_cursor LOOP
   INSERT INTO destination (a, b) VALUES (rec.a, rec.b)
END LOOP;

我想將其加快到超快的速度,因此嘗試進行一些BULK操作(BULK FETCH,然后進行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倍。

我在這里某個地方缺少瓶頸嗎?

與簡單的INSERT + SELECT ,您的代碼唯一的好處是您可以保存異常,而且(如Justin所指出的)您將擁有毫無意義的ORDER BY ,這使它可以執行很多無意義的工作。 這樣,您就沒有任何代碼可以對已保存的異常執行任何操作。

我只是將其實現為INSERT + SELECT

除非編碼本身需要,否則不必不必要地使用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM