スポンサーリンク

[Oracle] 大量データのバルクINSERTと通常INSERTの速度比較

概要

大量データの処理を高速で行えるバルク処理を使って、どのくらいの速度が違うのかを確認していきます。

処理概要

  1. データ件数は10万件で行う
  2. temp_empテーブルにある10万件のデータを取り出す
  3. 取り出したデータをempテーブルにINSERTする。

通常INSERT

ソースコード

set timing on

DECLARE
  CURSOR temp_emp_cur IS
  SELECT empid, name, age FROM temp_emp;

BEGIN

  FOR temp_emp_recode IN temp_emp_cur LOOP
    INSERT INTO emp(
      empid,
      name,
      age
    )VALUES(
      temp_emp_recode.empid,
      temp_emp_recode.name,
      temp_emp_recode.age
    );
  END LOOP;
  COMMIT;
  
  
END;
/
exit;

実行結果

上記をバッチで呼び出して実行した結果は、
「経過: 00:00:03.98」となり、約4秒の時間がかかりました。

バルクINSERT

ソースコード

set timing on

DECLARE
  CURSOR temp_emp_cur IS
  SELECT empid, name, age FROM temp_emp;
  
  TYPE temp_emp_type IS TABLE OF temp_emp%ROWTYPE
  INDEX BY PLS_INTEGER;
  temp_emp_rec temp_emp_type;
  
  i NUMBER;

BEGIN

  i := 0;
  FOR temp_emp_recode IN temp_emp_cur LOOP
    i := i + 1;
    temp_emp_rec(i) := temp_emp_recode;

  END LOOP;
  
  FORALL j IN temp_emp_rec.FIRST..temp_emp_rec.LAST
    INSERT INTO emp(
      empid,
      name,
      age
    )VALUES(
      temp_emp_rec(j).empid,
      temp_emp_rec(j).name,
      temp_emp_rec(j).age
    );
  
  COMMIT;
  
  
END;
/
exit;

実行結果

上記をバッチで呼び出して実行した結果は、
「経過: 00:00:00.56」となり、約0.6秒の時間がかかりました。

まとめ

通常INSERTと比較すると、バルクINSERTの方が8倍くらい早い結果になりました。
もっとデータ量が多かったりすると、相当な差が出るかと思います。
そのため、大量データを処理する場合は、バルクで処理したほうが高速に行えます。