次のSQLは、同一のスキーマを持つ2つのテーブル間で一致するすべてのレコードを生成し、この結果セットを格納するカーソルを反復処理します。この関数の最後にコミットを使用して、行ごとに挿入を行います。私の質問は、このタイプのクエリから最大のパフォーマンスを得るにはどうすればよいですか?コードは次のとおりです。
BEGIN
DECLARE
CURSOR foo IS
SELECT * FROM tableOne to
WHERE EXISTS (SELECT * FROM tableTwo tt
WHERE TO.FOO = TT.FOO
AND TO.BAR = TT.BAR); --THIS TAKES 5 MINUTES (66 MILLION ROWS)
BEGIN
FOR nextFoo IN foo
LOOP
INSERT INTO tracker t
(id,foo,bar,baz)
VALUES(trackerSequence.nextval, nextFoo.foo,nextFoo.bar,nextFoo.baz);
END LOOP;
COMMIT;
END;
END;
このクエリには1時間以上かかる場合があり、それに関連する時間コストを削減しようとしています。私は一般的に1億4000万レコードを処理するので、このプロセスにかかる時間は2倍になると予想しています。すべての列にインデックスが付けられます。
バージョン情報:
10g 10.2