トランザクションエントリに関する検証 その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つのセッションからこのブロックに何レコード(バイト)が挿入出来る
のか?領域が必要となった際にトランザクションエントリは解放されるのか?
次回も引き続きトランザクションエントリに関する検証を行います。
以上、花見をした翌日で二日酔いの茅ヶ崎にて