ラッチ(Latch)とOracleデータベース

 ラッチは、もともと家のドアなどにかけるチェーンのことで、
Oracleではシステム・グローバル領域(SGA)のメモリー構造を保護するためにOracleで使用される下位レベルの内部ロックです。
 サーバー・プロセス やバックグラウンド・プロセスは、SGAで操作を行う際に、メモリー情報が変更されないように
非常に短い間(1秒もない)、ラッチを獲得します。複数のプロセスがラッチ を獲得しようとすると競合がおき、待機が発生します。
 ラッチの目的は、同時に資源にアクセスすることで壊しあいや不整合を防ぐもので、アクセスをシリアライズします。
目的はロックと同じですが、ユーザーに見せるのがロック、ユーザーに見せないのがラッチです。
 一般的にラッチには、共有モードと排他モードがあるようです。共有モード同士は読み取りを許し、
相手が排他モードだったら読み取りは許されないです これも、可能なら並行度を上げるためです。
ラッチの種類 
1) 待機を伴うラッチ(willing to wait) 
ラッチがすぐに取得できない場合も要求を継続して再送し,それが満たされるまで待機する. 
2) 待機を伴わないラッチ(no wait latch) 
ラッチがすぐに取得できない場合に要求がキャンセルされ,別の新しい要求として発行される. 
ラッチの待機は待機イベント「latch free」で確認できます。
しかし、この待機イベントでは、どのラッチに競合が発生しているかは分からないため、
V$LATCHでより詳細情報を調べる必要があります。
 10gR1からは「latch : library cache」のように、待機イベント名を見てどのラッチで競合が発生しているか
簡単に特定できるようになりました。

 ※ラッチには非常に多くの種類があります。しかし、実際にチューニング可能なものはわずかしかありません。
また、ラッチの競合は他の問題が引起す1つの症状であるといえます。例えば、
ライブラリ・キャッシュを効率的に使用できるようにする(SQLの共有化・メモリー断片の解消)と、
共有プールのラッチ競合は解消されます。
◆ V$LATCHビュー
ラッチ別の集計ラッチ統計を示します。

<主な列> 
・NAME:ラッチ名
・GETS:ラッチが待機可能モードで要求された回数
・MISSES:1度目のラッチ獲得に失敗した回数
・SPIN_GETS:1度目のラッチ獲得に失敗したが、スリープせずにスピンしてラッチを獲
 得できた回数
・SLEEP1:スピンでラッチを獲得できず1回スリープしてラッチが獲得できた回数
・SLEEP2:2回スリープしてラッチが獲得できた回数
・SLEEP3:3回スリープしてラッチが獲得できた回数
・SLEEP4:4回以上スリープしてラッチが獲得できた回数
・SLEEP:スリープした回数
・WAIT_TIME :ラッチ獲得までの待機時間(マイクロ秒:1/100万秒単位)

以下に代表的な待機イベントの説明を記述します。
latch free: ラッチ競合が発生していることを示す。V$LATCHで詳細を調べる。
latch: library cache: ライブラリ・キャッシュ・ラッチによる競合。ライブラリ・キャッシュ・ミスを減らす。 
latch: library cache lock: ライブラリ・キャッシュ・ロック・ラッチによる競合。ライブラリ・キャッシュ・ミスを減らす。 
latch: cache buffers chains: cache buffers chainsラッチはバッファ・キャッシュでバッファ・リストを保護する場合に
使用される。このラッチの待機はアクセス頻度が高いホットブロックが存在することを意味する。ブロック競合を解消する。 
latch: cache buffers lru chain: キャッシュ内のバッファのリストを保護するラッチの競合。
複数バッファ・プールを利用するとラッチ数が増加するため、競合が減少する可能性がある。

通常はV$SYSTEM_EVENTビューでラッチに関する待機イベントを調べて、V$LATCHビューで各ラッチの詳細を調べる。