~ロールバックセグメントに関する検証 その3 ~
ペンネーム ちゃむ
前回は、プライベート・ロールバック・セグメントの使用される順番に関して
説明した。
今回は、TRANSACTIONS_PER_ROLLBACK_SEGMENTに関して掘り下げて調べていきた
いと思う。
TRANSACTIONS_PER_ROLLBACK_SEGMENT
マニュアルには以下のように書いてある。
---------------------------------------------------------------------- TRANSACTIONS_PER_ROLLBACK_SEGMENT には、各ロールバック・セグメントを処 理する同時トランザクションの数を指定します。起動時に取得されるロールバ ック・セグメントの最小数は、TRANSACTIONS をこのパラメータの値で割った数 です。たとえば、TRANSACTIONS が101でこのパラメータが10 の場合、取得され るロールバック・セグメントの最小数は101/10 となり、11 に切り上げられます。 ロールバック・セグメントをROLLBACK_SEGMENTS パラメータに指定すると、より 多くのロールバック・セグメントを取得できます。 ----------------------------------------------------------------------
この中で記述されていることを元に、以下のことを実際に調べてみようと思う。
1.CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)の値とどのよう
に関連して、パブリック・ロールバック・セグメントが起動されるのか?
(CEIL(A)ならA以上の最小の整数)
2.TRANSACTIONS_PER_ROLLBACK_SEGMENTで指定した数だけ、各ロールバック・
セグメントで同時トランザクションを処理できるのかどうか?
1.の検証
1_1.
パブリック・ロールバック・セグメントを50個作成する。
以下は、検証生活ではお馴染み「POPSQL」のスクリプト。
-----------------------POPSQLのスクリプト-----------------------
CONNECT SYSTEM/MANAGER
LOOP (I=1; I SHOW PARAMETER TRANSACTIONS
[/jva]
<pre>
NAME TYPE VALUE
------------------------------------ ------- ----------------
transactions integer 126
transactions_per_rollback_segment integer 4
</pre>
プライベート・ロールバック・セグメントは、以下のような指定で起動されて
いる。
[sql]
SVRMGR> show parameter rollback_segments
NAME TYPE VALUE
----------------------------------- ------- ------------------------------
rollback_segments 文字列 rb_test1,rb_test2,rb_find50
[/sql]
(rb_test1,rb_test2,rb_find50 ⇒ 3つのロールバック・セグメントを指定)
ロールバック・セグメントは、100個までonlineにできるように指定しておく。
[sql]
SVRMGR> show parameter max_rollback_segments
NAME TYPE VALUE
----------------------------------- ------- ------------------------------
max_rollback_segments 整数値 100
[/sql]
1_3.
この状態でデータベースを再起動し、以下のSELECT文でロールバック・セグメ
ントの状態を確認する。
[sql]
SELECT SEGMENT_NAME,OWNER,STATUS FROM DBA_ROLLBACK_SEGS ;
SEGMENT_NAME OWNER STATUS
-----------------------------
SYSTEM SYS ONLINE
RB_TEST1 SYS ONLINE
RB_TEST2 SYS ONLINE
RB_FIND50 SYS ONLINE
RB_PUB1 PUBLIC ONLINE |
RB_PUB2 PUBLIC ONLINE |
RB_PUB3 PUBLIC ONLINE |
RB_PUB4 PUBLIC ONLINE |
・ ・ ・ |
・ ・ ・ |← RB_PUB1からRB_PUB29までONLINE
・ ・ ・ |
・ ・ ・ |
RB_PUB27 PUBLIC ONLINE |
RB_PUB28 PUBLIC ONLINE |
RB_PUB29 PUBLIC ONLINE |
← ここからOFFLINE
RB_PUB30 PUBLIC OFFLINE |
RB_PUB31 PUBLIC OFFLINE |
RB_PUB32 PUBLIC OFFLINE |
・ ・ ・ |
・ ・ ・ |← RB_PUB30からRB_PUB50までOFFLINE
・ ・ ・ |
RB_PUB48 PUBLIC OFFLINE |
RB_PUB49 PUBLIC OFFLINE |
RB_PUB50 PUBLIC OFFLINE |
ONLINE OFFLINE
プライベート・ロールバック・セグメント 3 0
パブリック・ロールバック・セグメント 29 21
----------------------------------------------------------
計 32 21
[/sql]
CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)
= CEIL(126/4)=CEIL(31.5)=32である。
これは、上記のONLINEのロールバック・セグメントの合計数と一致する。
つまり、
CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)
- 初期化パラメータROLLBACK_SEGMENTSで指定した個数
=32-3=29
ということで、29個のパブリック・ロールバック・セグメントが起動されたの
である。
最後に、パブリック・ロールバック・セグメントをdropしておこう。
(offlineにしておかないとdropできないので注意!!)
[java]
-----------------------POPSQLのスクリプト-------------------------
CONNECT SYSTEM/MANAGER
LOOP (I=1; I<=50; I++)
SQL alter rollback segment rb_pub\I\ offline ;
SQL drop rollback segment rb_pub\I\ ;
ENDLOOP
------------------------------------------------------------------
次回は、2.について検証する。
以上 さわやかな潮風を感じながら 茅ヶ崎にて
