ロールバック・セグメントの管理

ロールバック・セグメントの見積もり

ロールバックセグメントの待機回数は、動的パフォーマンス表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 < 164
16 <= n < 328
32 <= nn/4(但し50以下)

また、特に指定しなければ、インスタンスは起動時に初期化パラメータTRANSACTIONS / TRANSACTIONS_PER_ROLLABACK_SEGMENTで算出される数のロールバックセグメントを獲得しようとする。パラメータROLLBACK_SEGMENTSにロールバックセグメント名が指定されている場合には、前記にかかわらずそれらは獲得される。

ロールバック・セグメントの最適化サイズの設定

通常のロールバックセグメントは、データベースの最大の表のサイズの10%になることが望ましい。そして、ロールバックI/Oパフォーマンスを最適化する設定は、各ロールバックセグメントに等しいサイズのエクステントが10から20ある場合である。

最初に割り当てる各エクステントのサイズは、[ロールバックセグメントの初期サイズ] / [最初に割り当てるエクステント数]で求められる。記憶領域パラメータには、INITINALNEXTにエクステントのサイズ、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;