ブロックにアクセスする際プロセスは該当ブロックに対してバッファ・ロックを獲得します。特定ブロックを変更する際も、該当ブロックに対してバッファ・ロックを排他モードで獲得します。特定ブロックに対しては読取時バッファ・ロックを共有ロックモードで獲得します。プロセスAがブロックXに対してバッファ・ロックを獲得している状態で、プロセスBが同一のブロックに対してアクセスをした場合バッファ・ロックを獲得できない為待機します。waits待機イベントです。waits待機イベントが最も多く確認されるのは、同時に複数のプロセスが同一のブロックに対してインサートやアップデートをする場合です。インサートやアップデートの作業は該当ブロックに対してバッファ・ロックを排他モードで獲得することを要求します。waits待機イベントによる待機が起こります。waits待機イベントの待機パラメータは以下の通りです。Oracle10gではブロック・クラスを意味し、Oracle9iでは原因コードを意味します。標準の待機時間は1秒です。waits待機イベントにて1秒待機した後に前プロセスがまだ待機中の場合、次の待機時間は3秒になります。特定ブロックを読もうとするセッションは必ずバッファ・ロックを獲得しなければなりません。1)ユーザーのアプリケーションにおいて、同時に複数のセッションが同一のブロックを変更するよう動作する場合、このようなブロックをホット・ブロックと言います。ホット・ブロックを解消する方法には、ユーザーアプリケーションの修正があります。アプリケーション修正を通じて同時に複数のプロセスが同一のブロックを変更しないようにします。PCTFREE値の調整:PCTFREEの値を大きくしてオブジェクトを生成すると一個のブロックに入る行の数が減り、その分ブロックの競合が減ります。偏った索引の変更:索引のキーが右に偏っていると索引リーフノードに対する競合が発生します。シーケンスの値を利用して生成したキーの値を索引に使う場合が代表的です。逆キー索引を使ってキーの値を分散すればブロックの競合を減らすことができます。ストレージの空きリスト属性の値を十分に大きくします。空きリストの値が1なら同時に複数のプロセスが同一のブロックにインサートを実行した際に、ブロックの競合が起きます。空きリスト属性の値は同時にインサートを実行するプロセスの最大数程度を推奨します。パーティションニング:セグメントパーティションニングを通じてブロックを任意に分散できます。ハッシュパーティションと同じ方法で一つに集まっていたブロックを物理的に分散することでブロックの競合を減らす効果が得られます。4)FLMを使用する場合、ストレージの空きリスト属性の値を十分大きくします。RAC環境なら空きリスト・グループ属性の値をインスタンスの数と同じにします。空きリストグループ属性の値を指定するとセグメントヘッダー・ブロックと別途に空きリスト・ブロックを使うので、その分セグメントヘッダー・ブロックの競合が減ります。10)ASSM(自動セグメント領域管理)を使う場合は3段階のビットマップ・ブロックから競合が発生します。ビットマップ・ブロックから発生するブロックの競合はチューニングを通じて改善できないので、アプリケーション修正を通じて過渡な同時DMLを減らします。大規模の同時DMLの場合、ASSMはFLMに比べて若干のオーバーヘッドを持っています。ほとんどの場合でこのようなオーバーヘッドは無視できる程度です。ASSMはFLMに比べて様々なメリットを提供するだけでなく、RAC性能の最適化にも貢献します。2*UNDOセグメント番号)AUM(自動UNDO管理)を使用する場合にはUNDOヘッダーからのブロック競合は滅多に発生しません。手動モードのロールバックセグメントを使用する場合はロールバックセグメントの数を十分大きくすることによってUNDOヘッダーブロックに対する競合を減らすことができます。waits待機現象が過渡に発生する状況をMaxGaugeを使ってモニタリングした結果です。したことが確認されました。次の図のように複数のセッションから特定の表に対する更新が行われたのが原因でした。ブロックをランダムに分散させるために次のようにハッシュパーティションを適用しました。100;次の図はハッシュパーティションを適用した後、同一アプリケーションをMaxGaugeを使ってモニタリングした結果です。waits待機イベントの発生が減少したことが確認できます。1,214秒に減少したことを確認しました。sessionに変更されました。分析対象のインスタンスは、アクティブセッション数が平均20~30個に維持できていますが、特定時点で300個以上まで急増する現象が発生しました。推移グラフは下図の通りです。waits待機イベントの待機が一番長く(1199秒)発生することが分かります。waits待機イベントの相関関係を調べるために2つのグラフを確認すると、増減の推移が一致することが分かります。waits待機イベントの発生が原因だと推測できます。waits待機イベントのP3値のidは220番です。220番は同一ブロックの変更時に、発生するバッファロック競合現象です。waits待機イベントの競合現象はたいてい不適切な空きリストの値によって発生します。waits待機イベントが発生します。waits待機イベントを待機するセッションの発生リストで確認して見ましょう。waits待機イベントで待機中に、ある瞬間HWエンキューを待機することが確認できます。waits待機イベントとHWエンキューイベントは空きリストと関連がありますので、インサートをする対象表のSUBSCRIBEの空きリスト、空きリストグループ属性の値を確認してみます。上記のようにSUBSCRIBE表は空きリストの値が1に設定されています。FLM(空きリスト管理)でセグメントを管理する場合、Oracleは基本的に一つのマスター空きリストを割り当てますが、もしセグメントを生成する時、空きリストの値を1にすると、マスター空きリストがプロセス空きリストに活用されます。waits待機イベントが発生します。マスター空きリストには新規に確保したフリーブロックが優先的に保存されますが、個別のプロセスがフリーブロックを必要とする時点でマスター空きリストから必要とする数のフリーブロックを取得します。マスター空きリストにフリーブロックがない場合は、HWロックを獲得し、HWMを利用してフリーブロックを確保します。この過程でHWエンキューが発生します。複数のセッションが同時にインサートを実行する表の空きリスト属性値が1だったのでバッファロック競合が発生し、これによってアクティブセッションが急増しました。この場合、問題になる表の空きリストの値を同時に実行されるプロセスの数を考えて複数の空きリストを使うように表を再生成するか、ASSMの使い方を考慮して解決することができます。Page本サイトに掲載されている情報は日本エクセム株式会社が提供しています。