![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
Oracle 10g R2 を使用し、開発を行っていますが、
パフォーマンス改善という壁にぶつかっており、
お助けいただきたいと思いました。
要求定義の段階で、可変長のバイナリデータを扱う必要があり、
テーブル内には BLOB フィールドを用意しております。
レコード件数にすると、全体でおおよそ 500,000 ~ 1,000,000 件に
なります。(導入先によって上記範囲内で変動する)
データはさらに区分によって判別されるようになっております。
プログラムから投入する SQL 文については、
最適化を行っておりまして、最高のパフォーマンスが得られる
であろう構文になっておりますし、テーブルの設計についても、
検索条件となる項目へのインデックス設定を行っています。
現状としてプログラムの中でボトルネックとなっているのは、
BLOB データを Fetch するタイミングなんです。
開発環境は、C#.NET+ODP.NET なんですけど、ミドルウェアは、
oo4o を使った場合でも、Microsoft の Oracle のドライバを
使用したときでも同じ部分でボトルネックになっていました。
ちなみに、BLOB をやめて、CLOB にした場合も、
CLOB データを Fetch する部分がボトルネックになっていました。
テスト段階なのでバイナリデータが 4 KB 未満ですが、
これを VARCHAR2(4000) のフィールドに Base64文字列などで
格納した場合は、LOB データの Fetch はありませんので、
かなり高速な処理が実現できるのですが、実際の運用では、
4 KB を超えるようなバイナリデータが普通に現れてきます。
なので、VARCHAR2 でのデータベース設計ができない状態です。
そもそも、この BLOB フィールドや CLOB フィールドのデータを
Fetch する速度を向上させること、というのは可能なのでしょうか?
ちなみに、Oracle サーバ側の設定は一切行っておりません。
No.3ベストアンサー
- 回答日時:
1冊のマニュアルになるボリュームがあって色々書かれているので
開発者ガイドを見てください。
「アプリケーション開発者ガイド- ラージ・オブジェクト」です
個人的には設計段階でLOBは使用しないように最大限粘っていると思います。
参考URL:http://otndnld.oracle.co.jp/document/products/or …
> MZ-80B さん
OTNのドキュメント、拝見しました。
LOB は使わない、ということですか。
格納するデータに制限をつければ確かに遅い LOB を使わずに、
高速なカーソル操作が実現できそうですね。
ちょっと設計を見直してみることにします。
No.2
- 回答日時:
下位互換といわれているのは LONG RAW の事ではないでしょうか。
RAW はこれからも残っていくデータ型だったと思います。
RAW型の最大サイズは2000バイトなのでBASE64のVARCHAR2(4000)と比べると
1カラムでの容量では負けてしまいますね。
> MZ-80B さん
度々回答していただき、ありがとうございます。
RAW 型について勘違いをしておりました。
大変、申し訳ございませんでした。
今の開発環境が、.NET Framework である、ということもあって、
GZIP による圧縮を仮に想定したとして、どれだけ圧縮されるのか、
これを十分に考慮してテーブル設計をやりなおさなければ、と思います。
今のところ、登録するバイナリデータの制限が無いことがあり、
RAW フィールドを、いくつテーブルに用意すればよいのか、
という点での問題が残ります。
もしかするとRAWフィールドを設ける方法が使えない、という場合も考えられます。
提供いただいた参考サイトを拝見しますと、そもそも Oracle という
データベースにおいて BLOB のアクセスが遅い、というような表現が
見受けられましたが、やはり BLOB というものを
MySQL 並みとは言わなくても、それに近づけるような速くする
チューニングテクニックというのは存在しないものなのでしょうか。
Oracle の製品で提供されている機能なんかを見てみると、
BLOB で出力しているパッケージ・ファンクションなんかが見つかります。
BLOB が遅いということになると、こういった関数の部分のパフォーマンスも
大きく劣ってしまう、ということだと思うんです。
No.1
- 回答日時:
LOBのデータサイズによってパフォーマンスは変わるので
ひとつの例として参考にしてください。
小さなLOBについて検証しているケースなので似た状況かも。
あとバイナリを扱うなら文字にエンコードするとサイズが倍増しますから
RAW型を使ったほうがよいです。
参考URL:http://www.drk7.jp/MT/archives/001196.html
> MZ-80B さん
回答ありがとうございます。
バイナリデータの圧縮、気づきませんでした!
確かにデータが小さければ小さいほど読み込むデータ量も
小さくできるので快適になることが期待されますね。
試してみます。
あと、確認なんですが、RAW型を使ったほうが良い、
ということが回答中にありますが、何故 RAW 型とされたのでしょうか?
OTNのドキュメントを拝見しておりますと、Oracle 10g では、
下位互換のために用意されている型とあります。
そういうわけで、RAW 型ではなく LOB 型を使ってほしい、
ということが書かれています。
RAW 型の変わりに LOB 型を使っても良いものなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
Oracleでの文字列連結サイズの上限
Oracle
-
CLOB型へのINSERT
Oracle
-
BLOB型項目をSQLの検索条件に指定して検索したいのですが。
Oracle
-
-
4
PL/SQLでSPOOLさせたいのですが、可能でしょうか?
Oracle
-
5
大量レコードをTRUNCATEせずにすばやく削除する方法
Oracle
-
6
BLOB型のPDF出力の方法
MySQL
-
7
Viewにインデックスは張れますか?
Oracle
-
8
ORACLEから各テーブルをCSV形式で出力するコマンド
Oracle
-
9
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
10
oracleのinsert select性能
Oracle
-
11
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
12
DBからタブ区切りのCSVデータを抽出する
Oracle
-
13
ファイルへの書き込みができない
Oracle
-
14
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
配列に指定した値が含まれてい...
-
ACCESSのクエリで空白以降を別...
-
int型フィールドにnullを登録で...
-
2回実行のSQL文を1回にしたい
-
2番目に小さい引数を返す関数
-
NULLの挿入の仕方が…?
-
MySQLでの近似値順での値の取得...
-
入力データの半角スペースと全...
-
CSVからNULL値をインポート
-
固定長データのテキストファイ...
-
テーブルのフィールドの一番長...
-
select文の実行結果に空白行を...
-
単一グループのグループ関数で...
-
ファイルの漢数字の順番につい...
-
【PL/SQL】FROM区に変数を使う方法
-
where句中のtrim関数について
-
Oracleで「文字が無効です」の...
-
アクセスのレポートでレコード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
2回実行のSQL文を1回にしたい
-
int型フィールドにnullを登録で...
-
SQLです下記の問合せを行うクエ...
-
SELECTした合計値をそのまま割...
-
BLOBやCLOBのパフォーマンスを...
-
テーブルのフィールドの一番長...
-
配列に指定した値が含まれてい...
-
Null値件数をカウントする式に...
-
固定長データのテキストファイ...
-
ACCESSのクエリで空白以降を別...
-
【MySQL】 DECIMAL(2,1) に 13...
-
複数フィールド対してLIKE '% ...
-
ファイルメーカー10で重複デー...
-
MySQLでの近似値順での値の取得...
-
NULLの挿入の仕方が…?
-
CSVからNULL値をインポート
-
MYSQLで月ごとの集計をおこない...
-
ファイルメーカーのフィールド...
おすすめ情報