概要
大量データの処理を高速で行えるバルク処理を使って、どのくらいの速度が違うのかを確認していきます。
処理概要
- データ件数は10万件で行う
- temp_empテーブルにある10万件のデータを取り出す
- 取り出したデータを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倍くらい早い結果になりました。
もっとデータ量が多かったりすると、相当な差が出るかと思います。
そのため、大量データを処理する場合は、バルクで処理したほうが高速に行えます。