[Oracle] LOB記憶特性 その2(CHUNK) | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

LOB記憶域の設定を検討する場合、「CHUNKのサイズをどれくらいにするか?」はかなり重要な要素です。


CHUNKとは、LOB値への1回のアクセスで読込みまたは書込みを行うバイト数の設定のことで、設定できる値はデータベース・ブロック・サイズの倍数でデフォルトで1ブロックサイズ、最大で32,768byteとなっています。


CHUNKのサイズは、多くの場合デフォルトで問題ないということなのですが、これを大きく設定すると、サイズの大きなLOB値に対するI/O効率が向上するとも言われています。


論より証拠、実際にCHUNKの設定によってI/O効率がどれくらい違うのかを実験してみました。


実験内容は、ブロックサイズ8Kの表領域に対し、CHUNKを8K、16K、32Kに設定したLOB記憶域を作成し、そこに合計数百MBのLOBデータを登録するという単純なものですが、それぞれ処理時間と領域使用量を計測してみると、以下のとおりになりました。

処理時間

CHUNK 処理時間(8Kを1とした場合)
8K 1.00
16K 0.75
32K 0.72

領域使用量
CHUNK 領域使用量(8Kを1とした場合)
8K 1.00
16K 1.10
32K 1.22


処理時間は8Kから16Kで25%ほど向上していますが、16Kと32Kではほとんど変わりがありません。


領域使用量は8K、16K、32Kとほぼ1割増でリニアに増加しています。


また、上記の実験は、空のテーブルに対する登録処理であるため、LOBデータを一旦削除した後に再度登録した場合の処理時間と領域使用量についても計測してみたところ、また別の傾向が見られました。

処理時間

CHUNK 処理時間(空のテーブルに対する登録を1とした場合)
8K 1.30
16K 1.25
32K 1.10

領域使用量
CHUNK 領域使用量(空のテーブルに対する登録を1とした場合)
8K 1.15
16K 1.22
32K 1.43


処理時間は8K、16K、32Kともに悪化していますが、CHUNKのサイズが小さいほどその傾向が強いようです。


領域使用量も8K、16K、32Kともに悪化していますが、CHUNKのサイズが大きいほどその傾向が強いようです。


以上の結果から、パフォーマンスと領域使用量はトレードオフの関係にあるということがわかります。


ということで、CHUNKのサイズは大きくすれば確かにI/O効率は向上しますが、むやみやたらと大きくしても逆に領域使用量が大きくなってしまうので、両者のバランスを考慮して設定しなければならないというところでしょうか。




【関連エントリ】
[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