前回はテストデータを自動生成する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での一括登録がおすすめです。