2016-09-13 11 views
0

の手順を使用して大規模なデータセットを挿入する私はテーブルのAAが複合キーとして200万件のレコードがaを持つ、6列(abcdef)が含まれていbc持っています。列aまたは列bまたは列cに複数の重複エントリがある可能性があります。列cには、それぞれabという複数のエントリがあります。は、Oracle Database

私はABが列abdeafbdなどを有する別のテーブルに(cが存在しない)、列aの値をコピーする必要がありbdefその列dが最大値の2とabのを持つことができるので、複合キーは、dは私がで書かを持っている2.

の最大エントリ数を持つ必要がありますN手順:

CREATE OR REPLACE Table_CHANGES(d IN AB.d%TYPE) 
AS 
    aaa  AB.a%TYPE; 
    aab AB.b%TYPE; 
    i    NUMBER := 0; 
    countRow  NUMBER; 

CURSOR distinctUserIdCursor IS 
    SELECT DISTINCT urt.a, urt.b FROM AA urt WHERE urt.d = aad ORDER BY urt.a; 

BEGIN 
    OPEN distinctUserIdCursor; 
    LOOP 

    FETCH distinctUserIdCursor INTO aaa, aab; 
    EXIT WHEN distinctUserIdCursor%NOTFOUND; 

    SELECT COUNT(*) INTO countRow FROM AB ur 
    WHERE ur.a = aaa 
    AND ur.b = aab 
    AND ur.d = aad; 

    IF (countRow > 0) THEN 
     DBMS_OUTPUT.PUT_LINE('Entry exist in AB'); 
    ELSE 
     INSERT INTO AB 
     SELECT urt.a, urt.b, urt.d, urt.e, 
     urt.f FROM AA urt 
     WHERE urt.a = aaa 
     AND urt.d = aad 
     AND urt.b = aab 
     AND ROWNUM = 1; 

     i := i+1; 
    END IF; 

    IF (i = 1000) THEN 
     COMMIT; 
     i := 0; 
    END IF; 

END LOOP; 
COMMIT; 
EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('Error in Insertion of new role' 
       || '~~~~' || SQLERRM); 
CLOSE distinctUserIdCursor; 
END; 
/

exec Table_CHANGES('value1')exec Table_CHANGES('value2')としてヒキガエルでこの手順を実行するが、それは約40分かかり、ヒキガエルで実行し続けます。ヒキガエルが実際に仕事をしているか、眠っているかどうかは分かりません。

テーブルABに数千万のデータを挿入するのにかかる時間が短くなるようにこの手順を最適化できますか?

答えて

0

私はあなたがコレクションを使って何をしているのか疲れています。 thatsが要件に合っているかどうかを確認し、パフォーマンスを向上させてください。

create table AA(a number, b number,c number,d number, e number,f number); 

create table AB(a number, b number,d number, e number,f number); 

手順:

CREATE OR REPLACE procedure Table_CHANGES(aad IN AB.d%TYPE) 
    AS 
    -- aaa   AB.a%TYPE; 
    -- aab   AB.b%TYPE; 
    -- i    NUMBER := 0; 
    -- countRow  NUMBER; 

    ///**Put some filtering logic here like i have put a minus ***/// 
    CURSOR distinctUserIdCursor(aad number) IS 
     SELECT DISTINCT urt.a, 
       urt.b, 
       urt.d, 
       urt.e, 
       urt.f 
     FROM AA urt  
     WHERE urt.d = aad 

     minus 
     SELECT DISTINCT ur.a, 
       ur.b, 
       ur.d, 
       ur.e, 
       ur.f 
     FROM AB ur  
     WHERE ur.d = aad; 


    type var_cur is table of distinctUserIdCursor%rowtype; 

    var var_cur; 

    BEGIN 
     OPEN distinctUserIdCursor(aad); 

     LOOP 

     FETCH distinctUserIdCursor bulk collect into var limit 100;  
     EXIT WHEN distinctUserIdCursor%NOTFOUND; 

     FORALL i IN 1 .. var.count SAVE EXCEPTIONS 
      INSERT INTO AB 
      VALUES var(i);    

     END LOOP; 

     CLOSE distinctUserIdCursor; 

    COMMIT; 

    EXCEPTION 
     WHEN OTHERS THEN 
      dbms_output.put_line('Error in Insertion of new role' || '~~~~' || SQLERRM); 
      FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
      LOOP 
       DBMS_OUTPUT.put_line (SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX|| ': ' 
        || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE); 
      END LOOP; 

    END; 
    /

実行:

execute Table_CHANGES(3) 
関連する問題