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領域を必要とする場合に、その前後でこういった手動見積もりが必要になることはあるかもしれません。