ロールバック・セグメントに関する検証 その2

投稿日: 2001年3月07日

~ロールバックセグメントに関する検証 その2 ~
ペンネーム ちゃむ

前回は、パブリック・ロールバック・セグメントと
プライベート・ロールバック・セグメントの違いについて述べた。
今回は、プライベート・ロールバック・セグメントの使用される順番に関して
説明する。

結果からいうと、プライベート・ロールバック・セグメントが使用される順番
は、初期化パラメータによって決められる。では、その様子を見ていこう。

1.初期化パラメータのrollback_segmentsの指定を確認

SVRMGR> show parameter rollback_segments

NAME                                TYPE    VALUE
----------------------------------- ------- ------------------------
max_rollback_segments               整数値  30
rollback_segments                   文字列  r1, r2, r3, r4, r0, RBS0

2.既存のテーブルを確認

SQL> select * from tab where tname like 'A%' ;

TNAME                          TABTYPE CLUSTERID
------------------------------ ------- ---------
A                              TABLE
A1                             TABLE
A2                             TABLE
A3                             TABLE
A4                             TABLE
A5                             TABLE
A6                             TABLE
A7                             TABLE

3.別プロセスから順番に以下のupdate文を発行する。
(sqlplusを個々に起動し、それぞれ以下のSQL文を発行。トランザクションを
終了させないためにcommitは発行しない。)

プロセス1より update a set ename = ‘osamu’;
プロセス2より update a1 set ename = ‘osamu’;
プロセス3より update a2 set ename = ‘osamu’;
プロセス4より update a3 set ename = ‘osamu’;
プロセス5より update a4 set ename = ‘osamu’;
プロセス6より update a5 set ename = ‘osamu’;
プロセス7より update a6 set ename = ‘osamu’;
プロセス8より update a7 set ename = ‘osamu’;

4.ロールバック・セグメントのトランザクション開始時間順にselectする。
(ロールバック・セグメントの使用された順番に検索)

select t.xidusn,r.segment_name,t.used_ublk, t.start_time
from dba_rollback_segs r,v$transaction t
where t.xidusn = r.segment_id
order by t.start_time;

   XIDUSN SEGMENT_NAME                   USED_UBLK START_TIME
--------- ------------------------------ --------- --------------------
        2 R1                                     2 02/26/01 14:44:39
        3 R2                                     1 02/26/01 14:45:00
        4 R3                                     2 02/26/01 14:46:17
        5 R4                                     2 02/26/01 14:46:36
        1 R0                                     1 02/26/01 14:46:51
        6 RBS0                                   1 02/26/01 14:47:06
        7 R_PUB                                  1 02/26/01 14:49:43
        2 R1                                     1 02/26/01 14:50:57

上記の結果と、初期化パラメータrollback_segmentsの指定の順番を見ると見事
に一致する。

R_PUBは、前回作成したパブリック・ロールバック・セグメントであるが、これ
は、初期化パラメータrollback_segmentsに最後に指定したかのように動く。
(今回は、CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)
=CEIL(75/5)=25なので、最大でプライベート、パブリック合わせて25個まで
のパブリック・ロールバック・セグメントを起動する。)

このように、初期化パラメータで指定された順番でロールバック・セグメント
が使用されていくといく構造を理解したところで、どのようなメリットがある
のだろうか?

<メリット>
ディスクI/Oの競合を減少できることにつながる。
それを示したものが以下の画像です。

このように、ディスクの分散を考えると、rollback_segmentsで指定する順番で
ロールバック・セグメントが使用されるのは、非常に重要なことであろう。

パブリック・ロールバック・セグメントを作成しておくと、初期化パラメータ
rollback_segmentsを指定しなくてもデータベースを起動することができるが、
rollback_segmentsを指定しないと、上記のようなメリットを享受できないこと
も覚えておこう。

以上 ちゃんと戻しておけ 茅ヶ崎にて