の手順を使用して大規模なデータセットを挿入する私はテーブルのAAが複合キーとして200万件のレコードがa
を持つ、6列(a
、b
、c
、d
、e
、f
)が含まれていb
、c
持っています。列a
または列b
または列c
に複数の重複エントリがある可能性があります。列c
には、それぞれa
とb
という複数のエントリがあります。は、Oracle Database
私はABが列a
、b
、d
、e
、a
とf
、b
、d
などを有する別のテーブルに(c
が存在しない)、列a
の値をコピーする必要がありb
、d
、e
、f
その列d
が最大値の2とa
、b
のを持つことができるので、複合キーは、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に数千万のデータを挿入するのにかかる時間が短くなるようにこの手順を最適化できますか?