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 件のコメント:
コメントを投稿