2012年2月28日火曜日

Oracle PL/SQL 読み込みデータのバルク処理 サンプル(修正前と修正後)

Oracle PL/SQLにおける、読み込みデータのバルク処理サンプルです。これまで、insert/updateのような書き込み系でバルクを主に行っていたのですが、読み込み情報のバルクを今回実装したので、サンプルをメモしておきます。
(下の例では、バルク処理単位として2000)


(※バルク処理を実装していない場合の例)

cursor cur is select  【カーソルで処理したい条件など】 ;
tab  【テーブル名】%rowtype

begin
        open cur;
        loop
       
                fetch cur  into tab;
                exit when cur%notfound;
                
                【tabを使った処理を行う】

        end loop;
       
end;
/


(※バルク処理を実装した場合の例 赤字が追加箇所

cursor cur is select  【カーソルで処理したい条件など】 ;
tab  【テーブル名】%rowtype
type tabArrType is table of 【テーブル名】%rowtype
tabArr tabArrType;


begin
        open cur;
        loop
       
                fetch cur bulk collect into tabArr limit 2000;
                exit when cur%notfound and tabArr.count=0;
               
                for i in tabArr.first..tabArr.last loop
                        tab := tabArr(i);
                       
                        【tabを使った処理を行う】
                       
                end loop;
        end loop;
       
end;
/




今回のバルク処理による
メリット(ねらい)は処理の高速化。
デメリットは、バルク処理件数単位での処理となるため、細かな例外制御が難しくなることや、場合によってはメモリ・CPUなどのリソースを圧迫することなどです。

ちなみに、今回私が上記処理を実装した結果、処理の高速化はほとんどありませんでした。
普通にカーソルで1件ずつ処理を行うのが十分に高速でできたため、、というのが原因の予想です。

Oracle で処理を高速化するのは、いろいろな要素があって難しいものです。。

0 件のコメント:

コメントを投稿