晶晶实验二_插入时对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 :
  --------------------------------------------------------
   0x02800089  Free: 5 Inst: 1
   0x0280008a  Free: 5 Inst: 1
  
  --------------------------------------------------------
End dump data blocks tsn: 12 file#: 10 minblk 139 maxblk 139

发现此L2块中,有两个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: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 :
  --------------------------------------------------------
   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 随机选择,因此以上插入操作提交与否并不影响最终结果.
标签: 暂无标签
fishcat

写了 55 篇文章,拥有财富 503,被 40 人关注

oracle爱好者
转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈