サイトアイコン こじりふぁ

テストデータ自動生成(一括登録) PL/SQL

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