ORACLE 挿入パフォーマンスの比較
Oracle データベースでは、送信の頻度が高いほど優れています。逆に、バッチ送信の方がパフォーマンスが向上する可能性があります。この記事では、Oracle データベースにおける行ごとの送信とバッチ送信のパフォーマンスの違いを簡単に説明します。最後に、パフォーマンスを大きく変える方法を紹介します。
1. テーブル t_ref を作成し、後で使用できるように 880992 個のデータを初期化します。実験
sec@ora10g> select * from all_objects; としてテーブル t_ref を作成します。
sec@ora10g>insertinto t_ref select * from t;
220248 行が作成されました。
sec@ora10g> /
sec
@ora10g> /
sec@ora10g> / sec@ora10g> /
sec@ora10g> /
440496 行が作成されました。
2. 単純な PL/SQL ブロックを作成して行ごとの送信をシミュレートし、実行時間に注意します。
私たちの目標は、t_ref テーブル内のすべてのデータを t に挿入することです。
sec@ora10g> タイミングをオンに設定
sec@ora10g> DECLARE
2 BEGIN
3 FOR cur IN (SELECT * FROM t_ref) LOOP
4 INSERT INTO t VALUES cur;
5 コミットします。
6 エンドループ。
7 終わり。
8/
PL/SQL プロシージャが正常に完了しました。
経過時間: 00:03:12.77
一行ずつ提出する場合、合計時間は 3 分 12 秒です。
3. バッチ送信をシミュレートしてみましょう。
sec@ora10g> テーブル t を切り詰めます。
テーブルが切り詰められています。
sec@ora10g>
2 v_count NUMBER を宣言します。
3 BEGIN
4 FOR cur IN (SELECT * FROM t_ref) LOOP
5 INSERT INTO t VALUES cur;
6 v_count := v_count + 1;
7 IF v_count >= 100 THEN
8 COMMIT;
9 終了 IF;
10 エンドループ。
11 コミット。
12 エンド;
13 /
PL/SQL プロシージャが正常に完了しました。
経過時間: 00:01:27.69
このときの合計時間は 1 分 27 秒で、1 行ずつ提出する方法の約半分の時間になります。Oracle がバッチ送信で作業を完了しようとする必要があることがわかります。
4. 最後に、Oracle のより高度な方法を使用して上記のタスクを完了し、究極の速度を体験します。
sec@ora10g> DECLARE
2 CURSOR cur IS
3 SELECT * FROM t_ref;
4 TYPE rec IS TABLE OF t_ref%ROWTYPE;
5 recs rec;
6 BEGIN
7 OPEN cur;
8 WHILE (TRUE) LOOP
9 FETCH cur BULK COLLECT
10 INTO recs LIMIT 100;
11 FORALL i IN 1 .. recs.COUNT
12 INSERT INTO t VALUES recs (i);
13 COMMIT;
14 EXIT WHEN cur%NOTFOUND;
15 END LOOP;
16 CLOSE cur;
17 END;
18 /
経過時間: 00:00:09.75
この時点で、以前は数分かかったタスクを完了するのに 10 秒もかかりませんでした。
5. まとめ
Oracle データベースでは、COMMIT を頻繁に行うと大量の Redo Log 物理 I/O が発生し、パフォーマンスが大幅に制限されます。したがって、データベースのパフォーマンスを向上させるには、データベースをできるだけバッチで送信してください。