晶晶实验二_插入时对L1块的选择篇
我的实验目的是证明:不同的会话做插入操作会选择不同的L1块,即使一个L1块内只使用了一个块。实验环境:
块大小:8K;区大小1M;实验表只包含一个区,为插入行;
步一:先通过查看dba_segments视图找到段头,通过段头找到L2块,转储L2块,查看一共有
几个L1,并记录其状态(L系列块的查找详见晶晶实验一,此处不再详述)
*** 2008-02-15 21:57:39.593
Start dump data blocks tsn: 12 file#: 10 minblk 139 maxblk 139
buffer tsn: 12 rdba: 0x0280008b (10/139)
scn: 0x0000.001e692e seq: 0x01 flg: 0x00 tail: 0x692e2101
frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK
Dump of Second Level Bitmap Block
number: 2 nfree: 2 ffree: 0 pdba: 0x0280008c
Inc #: 0 Objd: 52188
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x02800089Free: 5 Inst: 1
0x0280008aFree: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 12 file#: 10 minblk 139 maxblk 139
发现此L2块中,有两个L1。
转储其中一个L1块结果如下:DBA Ranges :
--------------------------------------------------------
0x02800089Length: 64 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:Metadata
4:unformatted 5:unformatted 6:unformatted 7:unformatted
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
16:unformatted 17:unformatted 18:unformatted 19:unformatted
20:unformatted 21:unformatted 22:unformatted 23:unformatted
24:unformatted 25:unformatted 26:unformatted 27:unformatted
28:unformatted 29:unformatted 30:unformatted 31:unformatted
32:unformatted 33:unformatted 34:unformatted 35:unformatted
36:unformatted 37:unformatted 38:unformatted 39:unformatted
40:unformatted 41:unformatted 42:unformatted 43:unformatted
44:unformatted 45:unformatted 46:unformatted 47:unformatted
48:unformatted 49:unformatted 50:unformatted 51:unformatted
52:unformatted 53:unformatted 54:unformatted 55:unformatted
56:unformatted 57:unformatted 58:unformatted 59:unformatted
60:unformatted 61:unformatted 62:unformatted 63:unformatted
--------------------------------------------------------
End dump data blocks tsn: 12 file#: 10 minblk 137 maxblk 137
因目前表为空,L1的64个数据块都是未格式化的,参考段头的转储信息,得知高高水点和低
高水点都是141。
步二,插入一条记录,此记录2000个字节。(命令略...)
步三,查看此记录被插入进哪个块,命令如下:
SQL> select dbms_rowid.rowid_block_number(rowid) from new2_jj_1;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
162
第一个L1中块的范围是137-->200块,此记录被插入进162号块,证明被插入在第一个L1中,
转储当前此L1块,状态如下:
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x02800089Length: 64 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:Metadata
4:unformatted 5:unformatted 6:unformatted 7:unformatted
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
16:75-100% free 17:75-100% free 18:75-100% free 19:75-100% free
20:75-100% free 21:75-100% free 22:75-100% free 23:75-100% free
24:75-100% free 25:50-75% free 26:75-100% free 27:75-100% free
28:75-100% free 29:75-100% free 30:75-100% free 31:75-100% free
32:unformatted 33:unformatted 34:unformatted 35:unformatted
36:unformatted 37:unformatted 38:unformatted 39:unformatted
40:unformatted 41:unformatted 42:unformatted 43:unformatted
44:unformatted 45:unformatted 46:unformatted 47:unformatted
48:unformatted 49:unformatted 50:unformatted 51:unformatted
52:unformatted 53:unformatted 54:unformatted 55:unformatted
56:unformatted 57:unformatted 58:unformatted 59:unformatted
60:unformatted 61:unformatted 62:unformatted 63:unformatted
--------------------------------------------------------
End dump data blocks tsn: 12 file#: 10 minblk 137 maxblk 137
从上面可以看到Oracle一次格式化16个块。
再转储段头,得知高高水点现在是201号块,它是第2个L1块中所表示的第一个数据快的编号。
**小结:高高水点的变化,1,如果一个L1能表示完一个区内所有的块的时候,Oracle移动高高水点,一次一个区。2如果区比较大,需要多个L1表示,那么Oracle是把它移动到下个L1块所表示的第一个数据块。
步四:换个会话再向该表插入一条记录
步五:查看此记录被插入进哪个块
SQL> select dbms_rowid.rowid_block_number(rowid) from new2_jj_1;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
157
162
此结果证明,该记录仍然被插入在同一个L1块中。
为什么没有象我设想的结论一样,不同的会话插入在不同的L1块中呢??
结论:第2个L1块在高高水标记之上,并没有被纳入到插入的可选范围内。之后我又多开了N个会话去实验,在高高水标记没有移动之前,所有插入都被送入第一个L1块下属的数据块中。
如果高高水标记移动后,第2个L1块 会在选择范围之内吗??
步六:插入N条记录,直到占满第一个L1块中所属的数据块(命令略..)
再转储段头,得知 高高水标记已经移动;
步七:删除表,并提交。因为刚才的插入操作已经占满了第一个L1块(不可使用截断,因为截断将释放表的区,)
步八:分别开两个会话,做插入操作。
步九:查看此记录被插入进哪个块
SQL> select dbms_rowid.rowid_block_number(rowid) from new2_jj_1;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
157
222
因L1块的范围是137->200,由此可见,两条记录被分别插入进两个L1块所表示的数据块。
Oracle 并不以块是否有事务来选择插入进某个块中,而是以进程的PID 随机选择,因此以上插入操作提交与否并不影响最终结果.
页:
[1]