前回はテストデータを自動生成するPL/SQLサンプルを紹介しました。しかし、1件ずつINSERTを行う作りになっていたため、大量データを作るのに時間がかかります。
それを改善するために、今回はFORALLを使って、一括でデータをINSERTするPL/SQLサンプルを紹介します。
テストデータ自動生成(一括登録) サンプルPL/SQL
DECLARE
-- ランダム文字列を生成するための変数を定義
TYPE typeListInt IS TABLE OF VARCHAR2(5 CHAR) INDEX BY BINARY_INTEGER;
DataList typeListInt;
-- 一括更新用にROWTYPE型変数を定義
TYPE typeTbData IS TABLE OF TB_DATA%ROWTYPE INDEX BY BINARY_INTEGER;
tbDataList typeTbData;
-- 連番設定用
wkID NUMBER(9);
BEGIN
----------------------------------------------
-- ランダム文字列の初期化
----------------------------------------------
DataList(0) := 'あああ';
DataList(1) := 'いいい';
DataList(2) := 'ううう';
DataList(3) := 'えええ';
DataList(4) := 'おおお';
----------------------------------------------
-- 100万レコードのデータを作成
----------------------------------------------
wkID := 0;
FOR i IN 1..10 LOOP
FOR j IN 1..100000 LOOP
----------------------------------------------
-- 1からの連番を生成
----------------------------------------------
wkID := wkID + 1;
tbDataList(j).ID := wkID;
----------------------------------------------
-- ランダムなコード値を生成
----------------------------------------------
tbDataList(j).CD := CEIL(DBMS_RANDOM.VALUE(0,4));
----------------------------------------------
-- ランダムな文字列を生成
----------------------------------------------
tbDataList(j).DATA :=
DataList(tbDataList(j).CD)
|| TO_MULTI_BYTE(LPAD(tbDataList(j).CD,7,'0'));
END LOOP;
----------------------------------------------
-- 10万件分のデータをINSERT
----------------------------------------------
FORALL j in 1..tbDataList.COUNT
INSERT INTO TB_DATA values tbDataList(j);
COMMIT;
END LOOP;
END;
/
FORALLを使用して10万件ずつ登録しています。
1件ずつINSERTするよりもパフォーマンスは格段にあがります。
私の環境では100万件データを1件ずつINSERTすると222秒かかりました。
しかし、FORALLを使用して100万件データを10万件ずつ登録すると28秒でした。
約7倍の速度でデータを作成できますので、FORALLでの一括登録がおすすめです。