UNDOに関する検証 その5

<UNDOに関する検証その5>
ペンネーム:クレイジーボーダー

前回は、UNDO表領域を変更する際の注意点を説明した。
さて、今回はUNDO情報を保存するのに必要な領域の算出方法からその問題点、
また逆に、ディスクのサイズ制限があるなどのUNDO領域割当てにおいて、仕様
要求がある時の保存期間の指定や問題について検証していきたい。

UNDO領域の必要なサイズを算出する前に、実際にファイルのサイズ制限のため
に使用できる領域がない場合、どのようにUNDO表領域が動作するのか試してみ
る。もちろん、この際はUNDO_RETENTIONの値は関係ない。

UNDO領域を作成する際に、AUTO EXTEND属性を含めず、ファイルのサイズを小
さめに作成する。その後、UNDO領域を使うような処理(インポート)を行なっ
た。

<インポート結果一部抜粋>

. importing TPC's objects into MAG2
. . importing table                     "CUSTOMER"
IMP-00058: ORACLE error 30036 encountered
ORA-30036: unable to extend segment by 32 in undo tablespace
           'UNDOTBS02'
IMP-00028: partial import of previous table rolled back: 4129 rows
           rolled back
. . importing table                      "HISTORY"

当然の結果だが、選択したUNDO領域には使用可能な領域がないというオラクル
のエラー(ORA-30036)が表示された。この結果は後に説明するが、V$UNDOSTAT
のカラム(NOSPACEERRCNT)から参照できるようになっている。

この対処としては、UNDO表領域を増やすか、commitの頻度を増やすしか方法は
ない。

さて、こういったUNDO領域のサイズに制限がある場合、いかに適度なUNDO表領
域のサイズを算出するかが重要になってくる。以下の式により必要な領域サイ
ズが算出される。

UNDOの保存に必要な領域 = (UR * UPS + OVERHEAD) * DBS

個々の項目内容は次の通りである。
1.(UR) UNDO_RETENTION(秒)
2.(UPS) 1秒間に使用する(作られる)UNDOブロックの数
3.(OVERHEAD) メタデータ使用時(トランザクション表等)のオーバーヘッド
4.(DBS) DB_BLOCK_SIZE

2番目の値を求めるには、動的パフォーマンス・ビュー(V$UNDOSTAT)を使用
する必要がある。このビューは、UNDO領域の監視とチューニングを行うための
統計情報が含まれている。ビュー内の各行には、インスタンス内で10分ごとに
収集された統計が表示され、現行の作業負荷に必要なUNDO領域の量を見積もる
ことが可能である。また、このビューには7日サイクルによる合計1008行が含
まれる。

以下を実行すると、1秒間に使用するUNDOブロックの数が計算される。

SQL> SELECT (SUM(UNDOBLKS))/SUM((END_TIME-BEGIN_TIME)*86400)
     FROM V$UNDOSTAT;

BEGIN_TIMEとEND_TIMEがDATEデータのために、秒に変更するため
86400(60*60*24)を掛けている。

では、1秒間に使用する(作られる)UNDOブロックの数を大体100ぐらいにし、
overheadは24とする。また、保存期間はフラッシュバック等を行ないたい為
3時間(10800)にする。

この条件でUNDO表領域を求めると
UNDOの保存に必要な領域 = (UR * UPS + OVERHEAD) * DBS

SQL> SELECT (((UR * UPS + 24) * DBS)/1024)/1024 AS "UNDO SIZE(MB)"
     FROM
    (SELECT VALUE AS UR
     FROM V$PARAMETER
     WHERE NAME = 'UNDO_RETENTION'),
    (SELECT (SUM(UNDOBLKS)/SUM((END_TIME - BEGIN_TIME) * 86400))
     AS UPS
     FROM V$UNDOSTAT),
    (SELECT VALUE AS DBS
     FROM V$PARAMETER
     WHERE NAME = 'DB_BLOCK_SIZE');

UNDO情報の保存に必要な領域は、約16GBになる。思っていた以上に大きなサイ
ズが必要という結果となった。

すなわち、負荷が高いシステムで、1秒間に使用する(作られる)UNDOブロック
の数が高い環境はもちろんだが、UNDO情報を保存する期間を延ばす場合、UNDO
表領域のサイズが非常に影響し、領域の問題となってくる。注意が必要である。

次回も、この動的パフォーマンス・ビュー(V$UNDOSTAT)に関して検証
していく予定である。

以上、アウェイ幕張から変わりホーム茅ヶ崎にて