|
步二,插入一条记录,此记录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 : -------------------------------------------------------- 0x02800089 Length: 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 随机选择,因此以上插入操作提交与否并不影响最终结果. |