LOB記憶域の設定を検討する場合、まずLOB列を通常のデータと同じようにインラインに格納する(ENABLE STORAGE IN ROW)か、アウトラインに格納する(DISABLE STORAGE IN ROW)かを選択することができます。
どちらを選択すべきかはそのLOBデータの特性次第で変わってきます。
まず、ENABLE STORAGE IN ROWとDISABLE STORAGE IN ROWの格納方法の違いは以下の通り。
- ENABLE STORAGE IN ROW(デフォルト)
- LOB値が4,000バイトまでであればインラインに格納され、4,000バイトを超えるとアウトラインに格納される。
- DISABLE STORAGE IN ROW
- すべてのLOB値がアウトラインに格納される。
ということで、デフォルトのENABLE STORAGE IN ROWの方が、LOB値のサイズに応じて臨機応変に格納してくれるため、通常はこちらを選択するのが望ましいとされています。
特にサイズのかなり小さなLOB値が多い場合、あるいはLOB値に頻繁にアクセスする場合はこちらの方が圧倒的に優れています。
DISABLE STORAGE IN ROWとしてアウトラインに格納する場合、どんなに小さなLOB値でもCHUNKサイズ分の領域が取られてしまい、領域の無駄遣いが非常に多くなるからです。
(例えば、CHUNKサイズが8,192バイトであれば、格納するLOB値が例え1バイトであったとしても8,192バイトの領域が取られてしまいます)
実際に、小さなLOB値が多いLOB列をDISABLE STORAGE IN ROWで作成して運用していたものをENABLE STRAGE IN ROWで再作成し、領域使用量やパフォーマンスが大幅に改善したということもあります。
DISABLE STORAGE IN ROWを使った方が望ましいのは、比較的大きいLOB値が多く、ENABLE STORAGE IN ROWだと行が大きくなってしまい、全表走査などが遅くなってしまうような場合など、ごく限られたケースではないでしょうか。
【関連エントリ】
[Oracle] LOBデータの基本的な扱い方 2004/12/03
[Oracle] JDBCによるLOBの操作方法 2004/12/06
[Oracle] LOBデータをファイルから直接登録する方法(その1) 2005/01/25
[Oracle] LOBデータをファイルから直接登録する方法(その2) 2005/01/27
[Oracle] LOBデータをファイルに直接出力する方法 2005/02/01
[Oracle] JavaでLOBデータを読み込む際の最適なバッファサイズは? 2005/02/02
[Oracle] LOB記憶特性 その1(STORAGE IN ROW) 2005/08/23
[Oracle] LOB記憶特性 その2(CHUNK) 2005/08/24