RAC環境におけるロックダウンに関する考察 その4

投稿日: 2004年4月28日

<RAC環境におけるロックダウンに関する考察 その4>
ペンネーム ちょびひげ

前回はロックダウンを発生させた数(他のインスタンスにあるカレントモード
のブロックを要求することにより、他のインスタンスでロックダウンが発生
した数)をオブジェクト毎に見ました。

自インスタンスでロックダウンが発生した数では無く、他のインスタンスに
対してロックダウンを発生させた数です。

レスポンスが遅い!と感じるのはロックダウンを発生させるインスタンスで
すから、パフォーマンスチューニングの観点では、こちらの方が重要と言え
ます。
複数台構成のRAC環境である1台でオンラインバッチなんかが行なわれると、
その一台のロックダウンを発生させた数が大きくなります。

このような重要な情報をもっているv$segment_statisticsですが、環境によ
ってはこの表自体へのアクセスが非常に負荷の高い処理となるので、検索時
にちょっとした工夫が必要となります。

■v$segment_statistics の特徴

まず、v$segment_statistics の特徴ですが、

・インスタンス起動時からのオブジェクト毎の統計値を保持している。
  つまり、データ件数が膨大です。

・統計値は累積値である。時系列の統計を見る差分を見る必要がある。

上記を踏まえると、v$segment_statistics の情報を時系列に取得して、時間
単位の差分をみる必要があります。

小規模なシステムでは可能かも知れませんが、何千ものオブジェクトが存在
する環境では難しいです。なぜなら、膨大なオブジェクトが存在する環境で
は、データ量が大きすぎて、情報を時系列に保持することは困難だからです。

■ロックダウンを発生させているオブジェクトを簡単に特定する

ではどうすればいいでしょう?事前にある程度オブジェクト数を絞ることが
出来れば統計情報を時系列に取る事が可能です。

そうです。簡単です。以下の条件に合うオブジェクトを見ればいいですね。

・データベースバッファ上でアクセスされているオブジェクト
・書込みが行われているオブジェクト

ダイレクト・ロードなどの一部の例外処理を除けば、全てのオブジェクトは
データベースバッファに乗ります。バッファ上の情報から、上記のオブジェ
クトの特定が可能です。

Writeが行われているオブジェクトは以下のSQL文で取得可能です。

SQL> l
  1  select obj , o.name,  count(*)
  2  from x$bh x , obj$ o
  3  WHERE bitand(flag,2097185) > 0
  4  and x.obj = o.dataobj#
  5  group by obj ,o.name
  6* order by 3 desc
SQL> /

       OBJ NAME                             COUNT(*)
---------- ------------------------------ ----------
     49447 CUSTOMER                              251
     49454 STOCK                                 241
       215 HISTGRM$                              134
       215 C_OBJ#_INTCOL#                        134
     49459 HISTORY_I1                             45
      3955 I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST          39
     49463 ORDERS_I2                              32
     49461 NEW_ORDER_I1                           28
     49824 NEW_ORDER_I2                           22
     49465 ORDER_LINE_I1                          15
     49462 ORDERS_I1                              14
         2 CLU$                                   13
         2 COL$                                   13
         2 IND$                                   13
         2 LOB$                                   13
         2 TAB$                                   13
         2 ICOL$                                  13
・
・
・
----------------------------------------------------------

(参考)
書込みが行われた場合、x$bh 列の以下のFLAGが立ちます。

buffer_dirty       [ダーティな状態    FLAG=1      ]
being_written      [書込み中          FLAG=32     ]
block_written_once [1回は書き込まれた FLAG=2097152]

上記のFLAGをすべて足すと、2097185になります。
なので、3つのフラグのどれかが立っているかどうかの判断は以下の
WHERE条件で行えます。

bitand(flag,2097185) > 0
———————————————————-

上記の検索されたオブジェクトの情報をv$segment_statistics から取得して
時系列の差分をみれば、Write/Write の競合が発生しているオブジェクト、
つまりロックダウンオブジェクトの特定が可能となります。

次回は上記の条件で実際に情報を取得して見ていきます。

以上、春風が気持ち良く快適通勤の茅ヶ崎にて