2018.01.31
Direct path read/write(lob)
目次
基本情報
LOB列を生成する際にNOCACHEオプションを使用すると、LOBセグメントの読み書き操作は、direct path I/ Oを使用して、この場合、direct path read(lob)、direct path write(lob)イベントを待機することになります。CACHEオプションを使用してLOB列を作成すると、バッファキャッシュを経由することになりますので、通常のデータと同じメカニズムに従うことになります。
LOBを作成する際にCACHEとNOCACHEのどちらのオプションを使用するかは、システムの特性とデータの特性に応じて異なります。もしSGAのサイズに余裕がない場合、またはLOBデータのサイズが大きい場合は、NOCACHEを使用することが有利となります。LOBデータが大きくなく、頻繁にアクセスされる範囲が決まっている場合はCACHEオプションを使用することにより、パフォーマンスの改善効果を得ることができます。
Parameter&Wait Time
Wait Parameters
direct path read/ write(lob)待機イベントの待機パラメータは以下の通りです。
・ P1:Absolute File# ・ P2:Starting Block# ・ P3:ブロック数
Wait Time
I/O関連のイベントなので、タイムアウトが発生せず、I/Oが完了するまでにかかった時間を示します。
Troubleshooting
LOB作成時の注意事項
LOBは、データの属性上、他のデータタイプにはない様々なオプションが存在します。不用意に使用した場合、多くのパフォーマンスの問題が発生することになります。LOBの作成時には、以下のような点に注意しなければなりません。
1. enable storage in rowオプションを使用している場合、4000 bytesよりも小さいLOBデータは、 Rowのようなブロックに格納されます。したがってRow chainingを誘発する可能性が高くなります。 4000 bytesより大きなLOBデータは、disable storage in rowオプションを使用したのと同じ効果があります。 LOBデータのサイズを考慮して、もしRow chainingが発生する可能性が高いと判断されると、 disable storage in rowオプションを使用することが得策となります。Rowのようなブロックに格納されている LOBデータはIn-line LOBと呼ばれ、LOBセグメントに格納されている場合には、Out-of-line LOBと呼ばれます。 2. disable storage in rowオプションを使用している場合、LOBデータは、別のLOBセグメントに格納され、 Rowには20 bytesのLOB Locator情報のみ保存される。この場合、UNDOデータはLOB Locatorにのみ生成されます。 LOBデータの実際のUNDO情報は、UNDO表領域に格納されず、同じLOBセグメント内に保存されることに注意しなければ なりません。 LOBセグメントのUNDOは、PCTVERSIONオプションによって制御されますが、仮にPCTVERSIONが50であれば LOB Segmentの空間の中で、50%が、UNDO情報を格納するために使用されます。したがってPCTVERSIONを低くする場合、 予期しないORA-01555:snapshot too oldエラーが起こることがあります。 LOBセグメントのUNDO領域不足による snapshot too oldエラーの場合rollback segment nameが空白で出力されます。 PCTVERSIONが小さすぎると、 ORA-01555エラーが発生する確率が高くなり、PCTVERSIONが高すぎるとスペースの無駄が多くなります。 この問題を解決する方法は、一般的なロールバック・セグメントでのORA-01555エラーの場合と同様です。 PCTVERSIONを適切に維持し、不要なコミットを減らします。 LOBセグメントの拡張スペースを適切に確保してくれることも 重要となります。 3. CACHE / NOCACHE、LOGGING / NOLOGGING:もしLOBデータのサイズが大きく、頻繁にアクセスされたり、ランダムに アクセスされる場合、NOCACHEオプションを使用することが望ましくなります。 NOCACHEオプションを使用する場合は、 REDOを生成するかどうかを指定することができます。もし必ず回復される必要がないデータであれば、Nologging オプションを使用することにより、パフォーマンスの改善効果を得ることができます。 CACHEオプションを使用している 場合は、必ずLogging属性を持つようになります。 NOCACHEオプションを使用する場合は、バッファキャッシュを経由 しないため、direct path read(lob)、direct path write(lob)イベントを待機することになります。しかし、 CACHEオプションを使用する場合には、バッファキャッシュを経由するため、db file sequential readとlatch: cache buffers chains待機を引き起こすことになります。 4. チャンク(chunk)のサイズ:Out-of-line LOBの場合はチャンク単位でLOBデータを格納することになります。 大きなチャンクサイズの問題は、スペースが無駄になる可能性が高くなります。もしチャンクが8Kになっているところに、 1KサイズのLOBデータが挿入されれば、残りの7Kの領域は使用できなくなります。したがってチャンクサイズを決定する際、 対象となるLOBデータのサイズを考慮して決定しなければなりません。チャンクのサイズの単位は、基本的には、 ブロックサイズの倍数にします。もしブロックサイズが8Kの場合、チャンクのサイズを5000 bytesにした場合、 Oracleは暗黙的に8192 bytesに変換します。チャンクのサイズを過度に小さくした場合には、連続的にチャンクを 割り当て受ける過程でオーバーヘッドが発生することになります。