トランザクションエントリに関する検証 その4

<トランザクションエントリに関する検証 その4>
ペンネーム しゅらん

今週も引き続きテーブルやインデックスを作成する際に設定するinitrans、
maxtransについて検証をしますが、今週は読者からの質問に関する検証を行い
ます。

検証環境
OS:Windows2000 Server
Oracle:8.1.7
DB_BLOCK_SIZE:8K

(質問内容)
現在、ブロックに幾つトランザクションエントリが作成されているか?
幾つ増えたかを知る方法はあるのでしょうか?

結論から言ってしまうと、ブロック毎のVIEWは存在しないのでやはりダンプを
取って確かめるしかない。

というわけで、今回もダンプを中心に解説していきます。

CREATE TABLE TBL_SHU3 (ID   DATE DEFAULT SYSDATE,
TEXT CHAR(10))
INITRANS 1 MAXTRANS 255 PCTFREE 10
STORAGE ( INITIAL     20M
NEXT        20M
PCTINCREASE  0
MAXEXTENTS  UNLIMITED);

—1行インサート—
まずは1行インサートを行ってみる。

insert into tbl_shu3 (TEXT) values ('PPPPPPPPPP');

ダンプの抜粋(ダンプの取り方については前回の
トランザクションエントリに関する検証 その3を参照)

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0002.054.0000004d    uba: 0x00800373.0005.2c  ----    1  fsc 0x0000.00000000

1つのトランザクションエントリが作成されている。
次にコミットを行い、ダンプを取得

Itl Xid Uba Flag Lck Scn/Fsc
0x01 xid: 0x0002.054.0000004d uba: 0x00800373.0005.2c –U- 1 fsc 0x0000.0004462a

Flagが「—-」から「–U-」 に変わっているがトランザクションエントリは
残っている。

—別セッションから1行インサート—

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0004.00d.0000004d    uba: 0x008006eb.0003.1b  ----    1  fsc 0x0000.00000000

コミット

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0004.00d.0000004d    uba: 0x008006eb.0003.1b  --U-    1  fsc 0x0000.00044630

トランザクションエントリは増えていない。

—1つのセッションから2行インサート—

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0005.05e.0000004c    uba: 0x008008b1.0002.28  ----    2  fsc 0x0000.00000000

コミット

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0005.05e.0000004c    uba: 0x008008b1.0002.28  --U-    2  fsc 0x0000.00044634

複数行を扱う場合でも、1つのトランザクションで扱う場合はトランザクショ
ンエントリは1つだけ使用する。Lckに記述されている数字が扱うレコード数を
意味している。

—3つのセッションから1行づつインサート—

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.00f.0000004d    uba: 0x00800b66.0005.57  ----    1  fsc 0x0000.00000000
0x02   xid:  0x0007.00f.0000004d    uba: 0x00800d07.0004.1e  ----    1  fsc 0x0000.00000000
0x03   xid:  0x0008.037.0000004d    uba: 0x00800ed7.0003.56  ----    1  fsc 0x0000.00000000

コミット

Itl           Xid                  Uba                      Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.00f.0000004d    uba: 0x00800b66.0005.57  --U-    1  fsc 0x0000.0004463b
0x02   xid:  0x0007.00f.0000004d    uba: 0x00800d07.0004.1e  --U-    1  fsc 0x0000.0004463d
0x03   xid:  0x0008.037.0000004d    uba: 0x00800ed7.0003.56  --U-    1  fsc 0x0000.00044639

これはトランザクションが別なので、3つのトランザクションエントリ
(0x01~0x03)が作成されている。

—トランザクションエントりの解放—
コミット後もトランザクションエントリが残っているが、これは履歴として
残っているだけなのか、解放されることはあるのか?

以下は4つのトランザクションエントリに増やした後に、truncate、Oracleの
再起動を行った後のブロックダンプである。

truncate後

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0011.050.0000004d    uba: 0x008020b8.0002.4e  C---    0  scn 0x0000.00044658
0x02   xid:  0x0013.03d.0000004d    uba: 0x008024ff.0003.4f  --U-    1  fsc 0x0014.0004465f
0x03   xid:  0x0010.031.0000004d    uba: 0x00801f1e.0004.3b  C---    0  scn 0x0000.00044655
0x04   xid:  0x000d.011.0000004d    uba: 0x008018c0.0002.55  C---    0  scn 0x0000.0004464c

再起動後

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0011.050.0000004d    uba: 0x008020b8.0002.4e  C---    0  scn 0x0000.00044658
0x02   xid:  0x0013.03d.0000004d    uba: 0x008024ff.0003.4f  --U-    1  fsc 0x0014.0004465f
0x03   xid:  0x0010.031.0000004d    uba: 0x00801f1e.0004.3b  C---    0  scn 0x0000.00044655
0x04   xid:  0x000d.011.0000004d    uba: 0x008018c0.0002.55  C---    0  scn 0x0000.0004464c

truncateしても再起動をしても残ったままである。

次に、新たにテーブルを作成し169セッションからinsertを行ってみる。
(同時にトランザクションエントリを使用するように、insertとcommitの間に
100秒間待機するようにする。)

CREATE TABLE TBL_SHU4 (TEXT VARCHAR2(1000))
INITRANS 1 MAXTRANS 255 PCTFREE 10
STORAGE ( INITIAL     1M
NEXT        1M
PCTINCREASE  0
MAXEXTENTS  UNLIMITED);

(弊社開発言語POPSQLを使用したロジック、これを169のセッションから実行)

SQL insert into tbl_shu4 (TEXT) values ('P');
SLEEP 200
COMMIT

ダンプを取って確認

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0001.012.00000052    uba: 0x00800158.000e.23  --U-    1  fsc 0x0000.0004832d
0x02   xid:  0x0002.037.00000050    uba: 0x00800375.0005.2b  --U-    1  fsc 0x0000.0004832f
・・・・・・・・・・・・・・・
0xa8   xid:  0x0012.018.00000052    uba: 0x00802277.0013.01  --U-    1  fsc 0x0000.00048458
0xa9   xid:  0x0013.027.00000050    uba: 0x0080250c.0004.01  --U-    1  fsc 0x0000.00048459

合計169個のトランザクションエントリが作成されていた。

では1つのセッションからこのブロックに何レコード(バイト)が挿入出来る
のか?領域が必要となった際にトランザクションエントリは解放されるのか?

次回も引き続きトランザクションエントリに関する検証を行います。

以上、花見をした翌日で二日酔いの茅ヶ崎にて