ロールバックセグメントの待機回数は、動的パフォーマンス表v$waitstatから得ることができる。
SELECT class, count FROM v$waitstat WHERE class IN ('system undo header','system undo block', 'undo header','undo block')
一方、データ要求の総数は、動的パフォーマンス表v$sysstatから得ることができる。
SELECT SUM(value) FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets');
待機回数がデータ要求回数の1%を上回る場合、ロールバックセグメントを増設することを検討する。一般的な推奨値は以下の通りである。
同時実行トランザクション数 | 推奨ロールバック・セグメント数 |
---|---|
n < 16 | 4 |
16 <= n < 32 | 8 |
32 <= n | n/4(但し50以下) |
また、特に指定しなければ、インスタンスは起動時に初期化パラメータTRANSACTIONS / TRANSACTIONS_PER_ROLLABACK_SEGMENTで算出される数のロールバックセグメントを獲得しようとする。パラメータROLLBACK_SEGMENTSにロールバックセグメント名が指定されている場合には、前記にかかわらずそれらは獲得される。
通常のロールバックセグメントは、データベースの最大の表のサイズの10%になることが望ましい。そして、ロールバックI/Oパフォーマンスを最適化する設定は、各ロールバックセグメントに等しいサイズのエクステントが10から20ある場合である。
最初に割り当てる各エクステントのサイズは、[ロールバックセグメントの初期サイズ] / [最初に割り当てるエクステント数]で求められる。記憶領域パラメータには、INITINALとNEXTにエクステントのサイズ、MINEXTENTSに初期エクステント数を指定する。
大きなトランザクションを実行する場合、ロールバックセグメントとOPTIMALパラメータはは大きくする必要がある。小さなトランザクションを数多く実行する場合、これらは小さくする必要がある。SERVER MANAGERのMONITOR ROLLBACK機能を用いることで、これらの利用情報を得ることができる。
特定のトランザクションをロールバック・セグメントに明示的に割り当てるためには、SET TRANSACTION USE ROLLBACK SEGMENT [セグメント名];文を実行する。
ロールバックセグメントの設定は、以下のデータ・ディクショナリ・ビューで監視することができる。
SELECT setment_name, tablespace_name, bytes, blocks, extents FROM sys.dba_segments WHERE segment_type = 'ROLLBACK';
また、ロールバックセグメントの状態は、以下のビューで監視することができる。
SELECT setment_name, tablespace_name, bytes, status FROM sys.dba_rollback_segs
但し、ロールバックセグメントをオフラインにすると、新規のトランザクションを受け付けない状態になる。そのような状態になっているロールバックセグメントは、以下の動的パフォーマンス表から確認する。
SELECT name, xacts 'ACTIVE TRANSACTIONS' FROM v$rollname, v$rollstat WHERE status = 'PENDING OFFLINE' AND v$rollname.usn = v$rollstat.usn;