質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

365閲覧

PL/SQLバイナリーデータファイル出力パフォーマンス向上

toshi1907

総合スコア1

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2024/07/02 12:45

編集2024/07/02 21:23
コード ```### 実現したいこと 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2024/07/02 23:35 編集

1つのディレクトリに何個くらいのファイルが出来るのでしょうか? 一度1つのダミーのファイルに連続出力させて時間を比較してみてもらえませんか?
toshi1907

2024/07/03 00:11

15個ぐらいです。 容量はまばらですが、大体1つ1MB程です。
退会済みユーザー

退会済みユーザー

2024/07/03 00:20

たった15個なら何の問題も起きなそうですね。 NTFSだと1フォルダに大量のファイルがあると開くのがかなり遅くなります。 何が原因で遅くなっているのか今ある情報だけでは見当が付かない感じです。 逆に15個しかないならファイル出力をする場合としない場合で比較するなど切り分けていくのが筋だと思います。 まずは自分でもっと調べてみてください。
sazi

2024/07/03 00:36 編集

OSは何ですか? ※ファイルシステムの特性と絡んだものがあるかもしれないので それと、ファイル出力さえしなければ、遅くはならないのですよね? 特定のファイルが非常に遅い等が無いかも確認された方が良いです。
toshi1907

2024/07/03 01:49 編集

OSはwindowsになります。 特定のファイルというよりは挙動を見ていると、最初の1MBほどのファイルは数秒で終わります。 そこから1秒20,30KB程の速度で書き込まれ4つ目ぐらいから一気に遅くなります。 今UTL_FILE.PUT_RAWの箇所をコメントして、ファイル読込だけで実行したところ、こちらも4ファイル目ぐらいから処理が遅くなっているので、読込の段階で問題がありそうです。
退会済みユーザー

退会済みユーザー

2024/07/03 02:14

読み込みで問題があるなら、コード中 '検索条件' となってボカシているところのパフォーマンスに問題があるのかもしれません。 ご使用のSELECT文に対するインデックスの有無や実行計画の確認などをして少しずつ詰めていくしかないと思いますよ。
guest

回答2

0

自己解決

皆様ご協力いただきありがとうございました。
こちら自己解決できました。
結論としては使用してSelect分のパフォーマンスが悪かったです。

投稿2024/07/04 01:18

toshi1907

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードがコードブロックになってないので、非常に見辛いです。

ループを重ねるごとに書き込み速度が遅くなっていき

という事なので、先ずはコミットをこまめにしてみてはどうでしょうか

投稿2024/07/02 14:53

sazi

総合スコア25279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2024/07/02 23:31

ファイルに書き出すようなので、テーブルへの書き込みではないと思いますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問