ロール・バックセグメントに関する検証 その4
~ロールバックセグメントに関する検証 その4 ~
ペンネーム ちゃむ
前回は、1.CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)の値と
どのように関連して、パブリック・ロールバック・セグメントが起動されるの
かを検証した。
今回は、2.TRANSACTIONS_PER_ROLLBACK_SEGMENTで指定した数だけ、各ロール
バック・セグメントで同時トランザクションを処理できるのかどうかを検証する。
今回の検証は、NT版 ORACLE8.1.6 DB_BLOCK_SIZE = 2Kの環境で行なった。
まず始めに、TRANSACTIONS_PER_ROLLBACK_SEGMENTは最大いくつまで指定できる
かを検証してみる。
TRANSACTIONS_PER_ROLLBACK_SEGMENT = 55を指定してOracleを起動すると、以
下のようなエラーメッセージが出力された。
ORA-02093:TRANSACTIONS_PER_ROLLBACK_SEGMENT(55) more than maximum possible(21)
これは、「TRANSACTIONS_PER_ROLLBACK_SEGMENTはMAXで21まで」しか設定でき
ないことを意味する。この前提を踏まえて今回の検証に入っていこう。
2.の検証
2_1
transactions_per_rollback_segmentを「4」に設定する。
SVRMGR> SHOW PARAMETER TRANSACTIONS_PER_ROLLBACK_SEGMENT NAME TYPE VALUE ----------------------------------- ------- -------------- transactions_per_rollback_segment 整数値 4
パラメータの意味からすると、1つのロールバック・セグメントで4つの同時ト
ランザクションを扱えることを意味するはずである。
2_2
以下のスクリプトを用いて、検証で必要なテーブルを作成
----------------POPSQL テーブルを50個作成するスクリプト------------- CONNECT SCOTT/TIGER LOOP( I=0 ; I<50 ; I++) REM Iは変数Iを値に展開 A_0、A_1、......、A49 50個のテーブルを作成 SQL CREATE TABLE A_I AS SELECT * FROM EMP; ENDLOOP --------------------------------------------------------------------
2_3
以下の2つのスクリプトで50同時トランザクションを作り出し、さらにそれを1
つのロールバック・セグメント(rb_find50)に書き込む。
trun50.callはtrun50.jobをバックグラウンドで50回実行する。そのとき、変数
Iの値も渡す。
----------POPSQL スクリプト名 trun50.call -------------- CONNECT SCOTT/TIGER LOOP( I=0 ; I popsql trun50.call
スクリプトtrun50.jobによるMESSAGEコマンドの出力結果は、以下のとおりである。
始めの21個のトランザクションは正常終了
UPDATE A_0 SET ENAME = 'KOBA'; OERR=0 UPDATE A_2 SET ENAME = 'KOBA'; OERR=0 UPDATE A_1 SET ENAME = 'KOBA'; OERR=0 UPDATE A_3 SET ENAME = 'KOBA'; OERR=0 UPDATE A_4 SET ENAME = 'KOBA'; OERR=0 UPDATE A_5 SET ENAME = 'KOBA'; OERR=0 UPDATE A_9 SET ENAME = 'KOBA'; OERR=0 UPDATE A_11 SET ENAME = 'KOBA'; OERR=0 UPDATE A_10 SET ENAME = 'KOBA'; OERR=0 UPDATE A_13 SET ENAME = 'KOBA'; OERR=0 UPDATE A_15 SET ENAME = 'KOBA'; OERR=0 UPDATE A_18 SET ENAME = 'KOBA'; OERR=0 UPDATE A_19 SET ENAME = 'KOBA'; OERR=0 UPDATE A_12 SET ENAME = 'KOBA'; OERR=0 UPDATE A_8 SET ENAME = 'KOBA'; OERR=0 UPDATE A_6 SET ENAME = 'KOBA'; OERR=0 UPDATE A_7 SET ENAME = 'KOBA'; OERR=0 UPDATE A_17 SET ENAME = 'KOBA'; OERR=0 UPDATE A_14 SET ENAME = 'KOBA'; OERR=0 UPDATE A_16 SET ENAME = 'KOBA'; OERR=0 UPDATE A_22 SET ENAME = 'KOBA'; OERR=0
残りの29個のトランザクションでは、ORA-1554が発生
UPDATE A_21 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_44 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_24 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_26 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_35 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_33 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_38 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_37 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_42 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_41 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_20 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_46 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_45 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_34 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_39 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_43 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_28 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_27 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_29 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_30 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_47 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_49 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_23 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_40 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_48 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_31 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_25 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_36 SET ENAME = 'KOBA'; OERR=1554 UPDATE A_32 SET ENAME = 'KOBA'; OERR=1554
これは、2_1でtransactions_per_rollback_segment=4であったが、実際は
21個の同時トランザクションを扱えたことになる。また、この21という数値は、
始めに述べた「TRANSACTIONS_PER_ROLLBACK_SEGMENTはMAXで21まで」という
MAX値に一致する。
結論を言うと、transactions_per_rollback_segmentの値に関わらず、1つの
ロールバック・セグメントで同時に21個のトランザクションを扱えるようだ。
また、このtransactions_per_rollback_segmentというパラメータは、パブリック・
ロールバック・セグメントをいくつ起動させるかを決定するためのパラメータ
であると言える。
ちなみに、この ORA-1554は、マニュアルで調べると次のように書いてある。
トランザクション表にトランザクション・スロットがありません。
原因 同時実行のトランザクション件数が多すぎます。
次回もさらに、この現象に関して迫ってみる予定である。
以上 海に行くと犬が目を閉じるほど風が強い茅ヶ崎にて