[Oracle] LOBデータをファイルから直接登録する方法(その2) | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

LOBデータをファイルから直接登録する方法(その1) ”で説明したように、DBMS_LOBパッケージのLOADFROMFILEプロシージャを使用する方法とJavaストアドプロシージャを利用する方法などによってLOBデータをファイルから直接登録することができます。


では、一体どちらを使った方がいいのか? 


それぞれの方法のメリットデメリットを挙げてみます。


DBMS_LOBパッケージのLOADFROMFILEプロシージャを使用する方法
【メリット】

・既にある機能を利用するだけである。

・Javaストアドプロシージャに比べCPU負荷が低い。

【デメリット】

・実行手順が煩雑である。

・ネットワークパス名を指定するとアクセスできない。 ※Windows版

・Javaストアドプロシージャに比べパフォーマンスが劣る。

・LOBデータをファイルに直接出力するプロシージャはない。

Javaストアドプロシージャを利用する方法
【メリット】

・実行手順がシンプルである。

・DBMS_LOBパッケージに比べパフォーマンスが優れている。

・メソッドさえ作ればLOBデータをファイルに直接出力することもできる。

【デメリット】

・Oracle JVMが必要。

・Javaストアドプロシージャの実装に手間がかかる。

・DBMS_LOBパッケージに比べCPU負荷が高い。



まず、お気軽に利用できるのは、DBMS_LOBパッケージの方です。


ただ、Javaストアドプロシージャの方も一旦作成して組み込んでしまえば簡単に利用できます。


CPU負荷やパフォーマンスについては、1台のマシンで130MB程度のファイルを1個を登録する処理を行って確認してみました。


その結果、CPU負荷はDMBS_LOBパッケージが6~7%、Javaストアドプロシージャが平均12~13%、パフォーマンスはDBMS_LOBパッケージが85~95秒程度、Javaストアドロシージャが60~70秒程度でした。


負荷を抑えたいならDBMS_LOBパッケージ、パフォーマンスを優先するならJavaストアドプロシージャといったところでしょうか。



機能的な制約としては、まず、DBMS_LOBパッケージの場合にネットワークパスにアクセスできないという問題があります。


これはDBMS_LOBパッケージの問題と言うよりはDIRECTORYオブジェクトの問題のようなのですが、もし他のマシン上のファイルにアクセスしたい場合は、事前にローカルドライブにマッピングしておかなければなりません。


また両者に共通することですが、他のマシン上のファイルにアクセスしたい場合は、Oracleを実行しているユーザーがそのファイルに対してアクセス権限を持っている必要があるので注意が必要です。



もう一つ、機能的な制約としてはDBMS_LOBパッケージではLOBデータをファイルから直接登録することはできますが、逆にLOBデータをファイルに直接出力することができません。


Javaストアドプロシージャの場合、メソッドを作ってやりさえすればLOBデータをファイルに直接出力することも可能です。


Javaでできることであれば、いろいろなことに応用できるというのが大きなメリットとなります。



というわけで、お気軽に使うならDBMS_LOBパッケージですが、パフォーマンスが要求される場合や、機能を応用したりしたい場合にはJavaストアドプロシージャの方がよいのではないでしょうか。




【関連エントリ】
[Oracle] LOBデータの基本的な扱い方 2004/12/03
[Oracle] JDBCによるLOBの操作方法 2004/12/06
[Oracle] LOBデータをファイルから直接登録する方法(その1) 2005/01/25
[Oracle] LOBデータをファイルから直接登録する方法(その2) 2005/01/27
[Oracle] LOBデータをファイルに直接出力する方法 2005/02/01
[Oracle] JavaでLOBデータを読み込む際の最適なバッファサイズは? 2005/02/02
[Oracle] LOB記憶特性 その1(STORAGE IN ROW) 2005/08/23
[Oracle] LOB記憶特性 その2(CHUNK) 2005/08/24