「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Oracle PL/SQLを使って大量データを処理する際、1行ずつループして処理を行うとパフォーマンスが低下します。
このようなケースで活躍するのが BULK COLLECTFORALL です。

これらを活用することで、SQLとPL/SQL間のコンテキスト切り替えを最小限に抑え、大量データを効率的に処理できます。


BULK COLLECTとは?

BULK COLLECTは、複数行のデータを一括でコレクション(配列型変数)に格納する仕組みです。

基本構文

 
SELECT カラム名 BULK COLLECT INTO コレクション変数 FROM テーブル名 WHERE 条件;

使用例

DECLARE
  TYPE t_emp IS TABLE OF employees%ROWTYPE;
  l_emp t_emp;
BEGIN
  SELECT * 
  BULK COLLECT INTO l_emp
  FROM employees
  WHERE department_id = 10;

  DBMS_OUTPUT.PUT_LINE('取得件数: ' || l_emp.COUNT);
END;

✅ 通常のSELECT INTOでは1行しか取得できませんが、BULK COLLECTを使うと複数行をまとめて変数に格納できます。


FORALLとは?

FORALLは、コレクションに格納されたデータを使って一括処理(INSERT/UPDATE/DELETE)を行う構文です。

基本構文

 
FORALL インデックス IN コレクション.FIRST .. コレクション.LAST DML文;

使用例

DECLARE
  TYPE t_empno IS TABLE OF employees.employee_id%TYPE;
  l_empno t_empno;
BEGIN
  -- 部署ID 20の社員IDをまとめて取得
  SELECT employee_id
  BULK COLLECT INTO l_empno
  FROM employees
  WHERE department_id = 20;

  -- 一括で給与を10%アップ
  FORALL i IN l_empno.FIRST .. l_empno.LAST
    UPDATE employees
    SET salary = salary * 1.1
    WHERE employee_id = l_empno(i);

  COMMIT;
END;
FORループで1件ずつUPDATEするよりも大幅に高速化できます。

BULK COLLECTとFORALLを組み合わせる

実務では、BULK COLLECTで一括取得 → FORALLで一括更新/削除といった流れがよく使われます。

処理フロー例

  1. BULK COLLECTで対象データを配列に取得

  2. 配列の内容をFORALLで一括更新

  3. コミット

このように組み合わせることで、バッチ処理や大量データ更新におけるパフォーマンスを劇的に改善できます。


パフォーマンス比較

  • 従来のループ処理
    SQLとPL/SQL間で行き来が多くなり、数万件以上の処理では遅くなる

  • BULK COLLECT + FORALL
    コンテキストスイッチが最小化され、処理速度が数倍〜数十倍向上するケースもある


注意点

  • BULK COLLECTで一度に大量データを取得するとメモリ不足の可能性あり
    LIMIT句を組み合わせて分割取得が推奨

  • FORALLはDML専用(SELECTでは使えない)

  • 例外処理はSAVE EXCEPTIONSを付けて制御することも可能


まとめ

  • BULK COLLECT → 複数行を一括取得

  • FORALL → 複数行を一括処理

  • 大量データ処理では必須テクニック

  • メモリ管理や例外処理に注意しつつ使うと、バッチ処理の効率が大幅に改善


💡 実際のプロジェクトでは「数十万件以上のデータ更新」で特に効果が出やすいため、PL/SQLチューニングの定番として覚えておきましょう。

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x