コード ```### 実現したいこと OracleDB上に格納していBLOBデータのファイル出力のパフォーマンスを上げたいです。 ### 前提 BLOBデータをファイルで出力すること自体は下記のPL/SQLで実現済みになります。 ###質問内容 今DBに格納されているBLOBデータをファイルとしてオブジェクトディレクトリが指定しているフォルダに出力するという作業をおこなっているのですが、作成した下記のPL/SQLだとパフォーマンスが酷4MB分のファイルを書き込んだところから一気にパフォーマンスが低下します。 最低でも1秒に数十KBほどの速度でのファイル書き込みを実現したいのですが、こういったPL/SQLの チューニングとしてどの様なことから始めればよいでしょうか?もしくは他にファイルを出力する方法についてご教授くださればと思います。 PL/SQLはあまり知識がなく、下記のソースコードも拾ったコードを少し変えた程度のもになります。 中身は自体は理解しています。 ### 発生している問題・エラーメッセージ 出力自体は出来るが、ループを重ねるごとに書き込み速度が遅くなっていき、最終的に1秒数キロバイトぐらいの速度でファイルの書き込みになる ### 該当のソースコード ```言語:PL/SQL DECLARE v_blob BLOB; v_offset INTEGER := 1; v_buffer RAW(32627); v_file_buffer_size INTEGER := 32000; v_amount INTEGER := 32000; v_totalsize INTEGER; v_filetype UTL_FILE.FILE_TYPE; v_filename VARCHAR2(1000); v_dir VARCHAR2(1000) := 'ORACLE_DIRECTORY'; BEGIN CURSOR C_CONTROL IS SELECT 'BLOBデータ' FROM 'BLOB格納テーブル' WHERE '検索条件' for i IN C_CONTROL LOOP DBMS_OUTPUT.PUTLINE('fileName:' || v_filename); v_totalsize := DBMS_LOB.GETLENGTH(v_blob_locater); v_filetype := UTL_FILE.FOPEN( v_dir, v_filename, v_openmode, v_file_buffer_size ); v_filename := 'C_CONTROLのselect結果を元に決定'; v_blob := 'C_CONTROLのselectで抽出したデータを代入'; while v_offset < v_totalsize loop if v_offset + v_amount > v_totalsize then v_amount := v_totalsize - v_offset + 1; end if; DBMS_LOB.READ( v_blob_locater, v_amount, v_offset, v_buffer ); UTL_FILE.PUT_RAW( v_filetype, v_buffer, true ); v_offset := v_offset + v_amount; DBMS_OUTPUT.PUT_LINE('Offset :' || v_offset); end loop; UTL_FILE.FFLUSH(v_filetype); UTL_FILE.FCLOSE(v_filetype); DBMS_OUTPUT.PUT_LINE('fileSize :' || v_totalsize); END LOOP; EXCEPTION WHEN OTHERS THEN UTL_FILE.FCLOSE_ALL; RAISE; END; / ### 試したこと UTL_FILE.FCLOSE(v_filetype);の直後にv_blob の中身を初期化(v_blob :=null) v_amount の値を調整 ### 補足情報(FW/ツールのバージョンなど) 環境情報 サーバ:WindowsServer2019 Oracle:Oracle19C
1つのディレクトリに何個くらいのファイルが出来るのでしょうか?
一度1つのダミーのファイルに連続出力させて時間を比較してみてもらえませんか?
15個ぐらいです。
容量はまばらですが、大体1つ1MB程です。
たった15個なら何の問題も起きなそうですね。
NTFSだと1フォルダに大量のファイルがあると開くのがかなり遅くなります。
何が原因で遅くなっているのか今ある情報だけでは見当が付かない感じです。
逆に15個しかないならファイル出力をする場合としない場合で比較するなど切り分けていくのが筋だと思います。
まずは自分でもっと調べてみてください。
OSは何ですか? ※ファイルシステムの特性と絡んだものがあるかもしれないので
それと、ファイル出力さえしなければ、遅くはならないのですよね?
特定のファイルが非常に遅い等が無いかも確認された方が良いです。
OSはwindowsになります。
特定のファイルというよりは挙動を見ていると、最初の1MBほどのファイルは数秒で終わります。
そこから1秒20,30KB程の速度で書き込まれ4つ目ぐらいから一気に遅くなります。
今UTL_FILE.PUT_RAWの箇所をコメントして、ファイル読込だけで実行したところ、こちらも4ファイル目ぐらいから処理が遅くなっているので、読込の段階で問題がありそうです。
読み込みで問題があるなら、コード中
'検索条件'
となってボカシているところのパフォーマンスに問題があるのかもしれません。
ご使用のSELECT文に対するインデックスの有無や実行計画の確認などをして少しずつ詰めていくしかないと思いますよ。
回答2件
あなたの回答
tips
プレビュー