ほとんどがバイナリ データで満たされたデータベース (Oracle) にクエリ機能を追加するように求められています。そのため、数キロバイトのブロブ内でバイナリ範囲をクエリできる必要があります。私はこれまでにこれをやったことがないので、このようなプロジェクトを開始するときに考慮すべきいくつかの良い慣行と落とし穴は何かと思っています.
ありがとう
ほとんどがバイナリ データで満たされたデータベース (Oracle) にクエリ機能を追加するように求められています。そのため、数キロバイトのブロブ内でバイナリ範囲をクエリできる必要があります。私はこれまでにこれをやったことがないので、このようなプロジェクトを開始するときに考慮すべきいくつかの良い慣行と落とし穴は何かと思っています.
ありがとう
BLOB データの MD5 チェックサムである MD5 の列を追加します。または、同じ主キーと MD5 列を持つ新しいテーブルを作成できます。
データベース外のキャッシュ モジュールは、キャッシュ ヒットで BLOB 列を 2 回取得する必要がないように、その列を利用できます。
または、BLOB データをデータベースにドロップし、MD5 値をファイル名として、http サーバーをネットワーク ファイル サーバーとして使用してファイル システムに格納することもできます。
正確な要件がわからないので、一般的なコメントしかできません。
Oracle の BLOB は、最も高速なタイプではありません。設計に多くのパフォーマンス ボトルネックを組み込まないようにし、構築する機能に対してできるだけ早くパフォーマンス テストを実行して、要件を満たしていることを確認してください。
dbms_lob はあなたの友達です。特に、read および substr 関数 (blob の一部を読み取るため) が役立つ場合があります。
外部の C スタイルの手続きは避けてください。かなり遅くなる可能性があります。PL/SQL 関数は、はるかに高速になる傾向があります。Java の手順についてはわかりません。Java エンジンは Oracle により統合されているため、非常に使いやすいかもしれません。PL/SQL と Java を比較するために、最初の概念実証を行う価値があるかもしれません。
Java を使用すると、データをバイト [] ストリームとして読み取り、Java の世界を使用して心ゆくまで操作することができます。Java の外部プロシージャは簡単に実行できます。Oracle に Java ソース コードを渡すだけでもかまいません。
PL/SQL の場合、非常に便利な手法の 1 つは、blob を raw に変換し、それを varchar にキャストしてから 16 進数に変換し、標準の Oracle 文字列関数を使用して 16 進数 (文字列) を操作することです。すなわち:
create or replace function retrieve_data_from_blob (
b blob
, tag_code
)
as
lw long raw;
data varchar(30000);
result varchar(100);
amount pls_integer := 30000;
begin
-- covert blob to long raw.
-- amount will hold total bytes read.
dbms_lob.read(b, amount, 1, lw);
data := util_raw.rawtohex(lw);
-- retrieve_embedded retrieves data tagged with tag_code
-- from internal binary structure by reading hex data
return retrieve_embedded(data, tag_code);
end;
/
これは、サイズが 15Kb までの BLOB で機能します。たとえば、retrieve_embedded 関数は、 を実行して最初の「バイト」を読み取り、それをオフセットとして使用してsubstr(data, 1, 8)
10 進数に変換することができます。to_number(hexdata, 'xxxxxxxx')
ストレージ パラメータは、比較的小さな BLOB (< DB_BLOCK_SIZE * 2 程度) の保存と取得の両方に関して、かなり大きな違いを生む可能性があります。一般に、行の移行と行の連鎖を最小限に抑え、無駄な空き領域を最小限に抑える必要があります。
おそらく、パフォーマンスに対する最大の効果は、「IN ROW」ストレージを有効または無効にすることです。これは、試してみる価値があります。