基本情報Oracleは、シーケンスを管理するために、3つののロックを使用します。lock:Sequence.nextvalを呼び出す過程でディクショナリ情報を物理的に変更する場合に獲得されます。NOCACHE属性を付与したシーケンスで使用されます。・SQロック:メモリにキャッシュされている範囲内でSequence.nextvalを呼び出し中に獲得されます。CACHE属性を付与したシーケンスで使用されます。・SVロック:RACでノード間の順序が保証された状態でSequence.nextvalを呼び出し中に獲得されます。ORDER属性を付与したシーケンスで使用されます。CACHE属性が付与されたシーケンスに対するnextvalを呼び出し中に、SQロックをSSXモードで獲得しなければなりません。contentionイベントを待機することになります。contentionイベントのP2の値は、シーケンスのオブジェクトIDです。したがってP2の値を利用してDBA_OBJECTSビューと結合する任意のシーケンスに対して待機現象が発生していることがわかります。:0待機時間enqueue待機イベントと同様に、最大3秒間待ちます。USロックを獲得できない場合は、取得するまで待機します。handle#Sequenceのキャスサイズを増加させます。NOORDER属性を付与します。多くのアプリケーションが、シーケンス値を利用してPK鍵を管理します。これは、一般的に望ましい現象であり、Oracleの基本的な動作の一つです。Index)現象を起こす恐れがあります。右偏向インデックスとキーの値が順次増加した場合、インデックスの右側最末端のリーフ・ノードのみインサート(Insert)が集中して競合が発生する現象をいいます。右偏向インデックス現象はあえてシーケンスオブジェクトを使わなくても順次増加するキー値を使用している場合には、常に発生することになります。右偏向インデックスは次のような面でのパフォーマンスに悪影響を与えます。Split)が頻繁に発生します。頻繁に発生するインデックスの分割は、REDOサイズの増加、TXロック競合の増加、DMLパフォーマンスの低下などの問題を誘発します。contentionイベント待ちで見ることができます。splitイベントも一緒に見ることができます。・複数のプロセスが同時にインサートを実行する場合には、右末端リーフノードがホット・ブロックになる可能性が高くなります。busyなどのイベント待ちで見られます。右偏向インデックス現象はよく知られている問題であり、次のような一般的な解決策が提示されていいます。Index)を使用します。リバースインデックスを使用している場合は、インデックスのリーフ・ノードに、ある程度ランダムに分散されるので、右偏向現象を減らすことができます。・インデックスキーを変更します。増加していないキーの組み合わせを使用することにより右偏向現象を減らすことができます。右偏向インデックスは、クラスタ内のすべてのインスタンスが同じリーフブロックを変更する過程で、グローバルブロックの競合が発生するため、RACシステムで追加のオーバーヘッドを誘発します。各インスタンスは、リーフブロックを変更するために、ブロックの最新バージョンを必要とします。各インスタンスが毎回ブロックを変更するので、最新のバージョンのブロックがノード間で絶えず送信される現象が発生するのです。グローバル・ホット・ブロックが生じます。requestなどのイベント待ちで見られます。幸いなことに右偏向インデックスによるグローバル・ホット・ブロック現象は、シーケンスのキャッシュサイズを増加させることによってある程度解消が可能となります。2つのノードで構成されるRACシステムでシーケンスのキャッシュサイズが10,000であるシーケンスの値をPKで使用するインデックスとしましょう。この場合、インスタンス1回{1〜10,000}、インスタンス2回{10,001〜20,000}のシーケンス値のセットを使用します。両方のインスタンスが、他の範囲のシーケンスセットを使用するため、同じリーフブロックを使用するために競争する確率が減少するのです。それだけグローバルブロックの競合が減少することになります。このような意味で、RACシステムでのシーケンス使用にORDER属性を付与することは、パフォーマンスの面で非常に不利な決定となります。ORDER属性のシーケンスを使用する場合には、ノード間のシーケンス値を絶えず同期するだけでなく、各ノードが同じシーケンスのキャッシュ値のセットを使用するので、右偏向インデックスによるグローバル・ホット・ブロック現象を避けることができないことになるからです。次の例は、2つのノードからなるRACシステムでシーケンスのキャッシュ・サイズとインデックスのリーフ・ブロックの競合の相関関係をテストしたものです。各ノードで同時に10個のセッションがインデックスを持つテーブルに対して、シーケンスキー値を利用してINSERTを実行します。インデックスのリーフブロックの競合によるクラスタ待機イベントが広範囲に発生することを確認することができます。各ノードで同時に10個のセッションがインデックスを持つテーブルに対して、シーケンスキー値を利用してINSERTを実行します。インデックスリーフブロックの競合によるクラスタ待機イベントが広範囲に発生することを確認することができます。CACHEサイズが20である場合に比べて、グローバルブロックの競合が多少減ったことを確認することができます。contention待機イベントが過度に発生します。・複数のプロセスが、シーケンス値を得るために同時にNEXTVALを呼び出す構造を使用している。・シーケンスのキャッシュサイズは、デフォルトで20に設定されている。contentionイベントを待機することを確認することができます。contentionイベントを待機しているセッションとそのシーケンスを追跡した結果は以下の通りです。OBJECT_NAME--------------------------------SEQ_SQ_ENQUEUEシーケンスのキャッシュ競合を減らすためにシーケンスのキャッシュサイズを以下のように10,000に増やします。contention待機イベントが減ったことを確認することができます。EnqueueイベントがTopに現れたことを確認することができます。session、waitイベント発生の推移を比較すると、グラフの増加推移が一致するのがわかります。Enqueueが発生するObjectのNumberを確認してみると、Object#=144で表示されます。DBA_OBJECTS・ディクショナリ・ビューの照会結果、144のオブジェクトはSYSのAUDSES$というシーケンスにおいて確認できます。DBA_SEQUENCES・ディクショナリ・ビューの照会結果、AUDSES$シーケンスのcache値がdefaultである20に設定されているのがわかります。Enqueueを待機するセッションのログオン時間を確認してみると、競合が発生する直前にログオンした事実を知ることができます。‘SESSIONID’)関数で照会が可能です。AUDSID値は、Oracleディクショナリのシーケンスによって割り当てられ、このシーケンスがまさにSYS.AUDSES$を指します。新しいセッションが接続すれば、SYS.AUDSES$のNEXTVALが増加し、セッションに新しい値が割り当てられることになります。sysdba、バックグラウンドプロセスなど)、SYS.AUDESE$に割り当てられません。Enqueueが発生したオブジェクトは、ディクショナリのSYS.AUDSES$シーケンスで、新しいセッションの作成時にNEXTVALを利用してAUDSID値を生成します。Enqueueを待機するセッションは問題時点の直前にログオンしたことが確認され、SYS.AUDSES$のcache値はdefaultである20です。lock発生する)再キャッシュする作業を実行しなければなりません。contentionイベント時間が増加することになります。contention待機問題を解決することができるのです。Page本サイトに掲載されている情報は日本エクセム株式会社が提供しています。