コード ```### 実現したいこと 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
回答2件
あなたの回答
tips
プレビュー