ASSMに関する検証 その9

<ASSMに関する検証 その9>
ペンネーム: サマー・リーフ

▼前回までのおさらい

2回に渡り、自動セグメント領域管理(ASSM)、FREELIST管理の表領域に作成
したテーブルに対して、SQLを実行して待機イベントの統計をもとに比較して
きました。

↓↓↓↓↓ 詳細は、バックナンバーを参照してください。 ↓↓↓↓↓↓↓↓

⇒各セグメント管理方法にて、デフォルト設定値のテーブルを作成して比較

<ASSMに関する検証 その7>
https://www.insight-tec.com/mailmagazine/ora3/vol337.html

⇒FREELIST管理のテーブルの ‘freelists’ オプションを調整して比較

<ASSMに関する検証 その8>
https://www.insight-tec.com/mailmagazine/ora3/vol338.html

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

自動セグメント領域管理(ASSM)では、同時トランザクション実行時に
FREELIST管理にて発生しがちな ブロック競合(セグメントヘッダの競合)が
大幅に軽減される事を待機イベントの統計情報から確認できましたね。

今回は、FREELIST管理におけるテーブルの storage句(”freelist groups”)
を調整して、各セグメント管理についてみていきます。

■FREELIST管理セグメントの空きリストグループ(”freelist groups”)につ
いて

セグメント(テーブル)を作成する際、空きリストグループ数を調整するため
に storage句で指定するパラメータです。
storage句の “freelist groups” 値を指定しないと、最小値 1(デフォルト)
と設定されます。

空きリストグループ数を 1 以上に設定することにより、複数のインスタンス
がテーブルの空きブロックを確保する際の競合を軽減することができます。

従って、FREELIST管理セグメントの空きリストグループ数を調整する事は、
単一データベース、複数インスタンスの Real Apllication Cluster(以降、
RACと表記)環境で有効とされています。

ということで、RAC について少しだけ前準備!!

皆さんご存知かと思いますが、ブロック競合は RAC環境でも問題視されがちで
す。
別々のインスタンスのバッファキャッシュの内容の同期を取るために、ブロッ
ク情報を転送しあう仕組みなので内部動作が忙しそうです。

従って、ブロック競合を軽減することは、RACのチューニングポイントとも言
えます。

読者の中で グローバルキャッシュ関連(gc ***)の待機イベントと戦った方
は、いらっしゃるかと思います。
グローバルキャッシュとは、RAC の用語です。
簡単に説明すると、単一データベースを構成する複数のインスタンスでキャッ
シュされたブロックの同期を調整して、一貫性を保障する仕組みです。

簡単なようで、理解しずらいかもしれません・・・

ORACLE 10gになり、9iに比べると待機イベントの種類が、かなり増えました。
それだけ、待機してしまう現象を掴む為の情報が、詳細に分かれたということ
でしょう。

RAC を採用した事がない読者の方は、是非バックナンバーを一読してください。
イメージを掴めると思います。

↓↓↓↓↓ バックナンバー ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

⇒ORACLE 9i RACの検証
※10gでは待機イベントの名称が変わっていますが、とても参考になります

<Oracle Real Application Clusterの検証 ~その1~>
https://www.insight-tec.com/mailmagazine/ora3/vol151.html ~

⇒ORACLE 10g RAC 構築
※構築がメインの連載なので、今回の内容とは結びつかないかも・・・
<Oracle新人のRACインストール その1~>
https://www.insight-tec.com/mailmagazine/ora3/vol291.html ~

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

本題に入る前に息切れしちゃいそうですね・・・

さっそく、検証していきましょう。

■環境

OS :Red Hat Enterprise Linux ES release 4
DB :Oracle10g EE Release 2( 2 NODE RAC)

■検証

RAC環境(2 NODE )にて、ノード毎から同時に SQL(INSERT)を実行して、
各セグメントの管理方法を待機イベントに着目して比較してみましょう。
(前回までと同様に、複数セッションとします。)

※準備としてテーブルに行データを格納した後、全行データを削除して空き
ブロックを発生させて検証します。

  (1)自動セグメント領域管理(ASSM)⇒デフォルトでテーブル作成
  (2)FREELIST管理 1                ⇒デフォルトでテーブル作成
  (3)FREELIST管理 2                ⇒"freelists"を "3"
                                     "freelist groups"を "2"
                                     でテーブル作成
                                    ※同時SQL実行数を見越して 
                                     "freelists"の値を 3 としています。
                                    ※同時アクセスインスタンス数を見越
                                      して 
                                     "freelist groups"の値を 2 として
                                      います。

●各検証パターンで作成したテーブルの設定値

    (1) FREELIST_GROUPS ⇒ 設定されない(ASSMでは設定不要)
    (2) FREELIST_GROUPS ⇒ 1 (デフォルト)
    (3) FREELIST_GROUPS ⇒ 2 (RACを構成するノード × 2)
                  
      OWNER  TABLE_NAME      FREELISTS  FREELIST_GROUPS
      ------ --------------- ---------- ---------------
      ITI1   SUMMER_LEAF                                 ←(1)
      ITI2   SUMMER_LEAF             1               1   ←(2)
      ITI2   SUMMER_LEAF_2           3               2   ←(3)

●バッファキャッシュ関連(”buffer busy waits”)の 待機イベント

今回も比較の指標として “buffer busy waits” 待機イベントの回数、
待機時間の統計をみていきます。

(1)自動セグメント領域管理(ASSM)

     [ノード1]
                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits      5,847      0          9      1      0.0

[ノード2]

ノード2の方が、この待機イベント回数が多く発生しています。
ノード1の更新情報と競合していると思われます。

                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits     14,165      0         12      1      0.0

(2)FREELIST管理 1

FREELIST管理、且つ フリーリストグループをデフォルトの 1 とした場合
自動セグメント領域管理(ASSM)と比較すると、待機回数、待機時間共
に大きな値になっています。

     [ノード1]
                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits    130,413      0         78      1      0.4
     [ノード2]
                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits    149,058      0         79      1      0.5

(3)FREELIST管理 2

FREELIST管理、且つ フリーリストグループをインスタンス数に合わせて
調整した結果をみると・・・
予想以上に待機イベントが発生していません。
ブロック競合が無いに等しい結果となりました。

各インスタンスで、別々の空きリスト(フリーリスト)で空きブロック
を管理する為、テーブルのセグメントヘッダの競合は、ほとんど発生し
なくなると事は推測できますね。

     [ノード1]
                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits         17     35          6    372      0.0
     [ノード2]
                                                       Avg
                                    %Time Total Wait   wait    Waits
     Event                   Waits  -outs   Time (s)   (ms)     /txn
     -------------------- -------- ------ ---------- ------ --------
     buffer busy waits          8      0          0     15      0.0

[まとめ]

(1)自動セグメント管理(ASSM)は、待機イベントの発生が各ノードでバラつ
きがある結果となりました。
インスタンス間のキャッシュ内容のやり取りで何かが、起きているかもし
れません。

(2)FREELIST管理、且つ デフォルト値(FREELIST 1、FREELIST GROUPS 1)で
作成したテーブルは、ブロック競合の嵐のような結果となりました。

(3)FREELIST管理、且つ FREELIST 3、FREELIST GROUPS 2 とstorage句のパラ
メータをチューニングした状態では、ほぼブロック競合が発生しない結果
となりました。

自動セグメント管理(ASSM)よりも効率よく処理されるようです。

RAC環境において、デフォルト値で作成しているセグメントがあれば、
FREELIST GROUPS値の調整を検討しみてはいかがでしょうか?

FREELIST値に関しては、同じセグメントに対して同時トランザクション数
の把握が、ちょっと手間となるかと思います。

今日は、ここまで

次回は、冒頭で説明した RAC固有のグローバルキャッシュ関連(gc ***)の
待機イベントなど情報を元に更に詳しく比較していきたいと思います。

すごしやすい、5月も終わりですね~
あっという間に梅雨が、きそう・・・と、その前にさくらんぼ狩り!
茅ヶ崎にて