[Oracle] UNDO表領域の必要容量見積もり方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

UNDO表領域に必要な容量は以下の公式で見積もることができます。

UNDO表領域必要容量(byte)
= UNDO保存期間(秒) × 1秒あたりUNDOブロック生成数 × ブロックサイズ + オーバーヘッド(byte)

例えば、UNDO保存期間が900秒で、1秒あたりのUNDOブロック生成数が100で、ブロックサイズが8192バイトの場合、

900×100×8192=737280000

つまり約703MB+オーバーヘッドということになります。


この計算に必要な情報はV$UNDOSTATまたはDBA_HIST_UNDOSTATから得ることができます。

これらのビューにはUNDO統計情報が10分ごとに記録されています。

SQL> SELECT TO_CHAR(BEGIN_TIME,'MM/DD HH24:MI') AS BEGIN_TIME, TO_CHAR(END_TIME,
'MM/DD HH24:MI') AS END_TIME, UNDOBLKS, MAXQUERYLEN, TUNED_UNDORETENTION FROM V$
UNDOSTAT;

BEGIN_TIME   END_TIME       UNDOBLKS MAXQUERYLEN TUNED_UNDORETENTION
------------ ------------ ---------- ----------- -------------------
08/03 14:06  08/03 14:12           9        1836                2380
08/03 13:56  08/03 14:06      124707        1537                2017
08/03 13:46  08/03 13:56      208288         931                1413
08/03 13:36  08/03 13:46      229113        1558                2100
08/03 13:26  08/03 13:36      246821         951                1495
08/03 13:16  08/03 13:26      229542         345                 900
08/03 13:06  08/03 13:16          23           0                 900
08/03 12:56  08/03 13:06        6854         142                 900
08/03 12:46  08/03 12:56       14068         138                 900
08/03 12:36  08/03 12:46       12774         943                1483
08/03 12:26  08/03 12:36       29673         339                 900
08/03 12:16  08/03 12:26          13           0                 900
08/03 12:06  08/03 12:16          13           0                 900
08/03 11:56  08/03 12:06          91           0                 900
08/03 11:46  08/03 11:56           3           0                 900
08/03 11:36  08/03 11:46           9           0                 900
08/03 11:26  08/03 11:36           7           0                 900
08/03 11:16  08/03 11:26       12516          88                 900
08/03 11:06  08/03 11:16       17479          83                 900
08/03 10:56  08/03 11:06         142           0                 900
08/03 10:46  08/03 10:56         337           0                 900

1秒あたりのUNDOブロック生成数は、UNDOBLKSから計算することができます。

上記のビューのUNDOBLKSは10分間に生成されたUNDOブロック数ですから、これを600で割ると1秒あたりのUNDOブロック生成数となります。


UNDO保存期間は、最も長い問い合わせの実行時間を目安に見積もることができます。

上記のビューのMAXQUERYLENは10分間に実行されていた問い合わせのうち最も長い問い合わせの実行時間(秒)ですから、UNDO保存期間をそれ以上にすることによって、読み取り一貫性エラー(ORA-01555:スナップショットが古すぎます)の発生を回避することができます。


と、ここまで書いておいてなんですが、Oracle10gでは、上記のようにわざわざ手動で計算しなくとも、「UNDOアドバイザ」の機能を使用すればOracleが自動的に推奨値を算出してくれます。

さらに自動UNDO保存チューニングの機能によって、読み取り一貫性エラーが発生しないようUNDO保存期間を自動的に調整してくれます。

(上記のビューのTUNED_UNDORETENTIONはOracleが自動UNDO保存チューニングしたUNDO保存期間を示します。)

また、UNDO表領域を自動拡張の設定にしておけば、UNDO表領域が足りなくなったときにも自動的に拡張してくれます。


ということで、通常の運用時には上記のように手動で計算することはあまりないと思われますが、データベースの初期構築時や、データ移行時など、一時的に大量のUNDO領域を必要とする場合に、その前後でこういった手動見積もりが必要になることはあるかもしれません。