专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>oracle>

插入时对L1块的选择篇(晶晶实验二)

百度收藏 QQ搜藏

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

上一页 1 2下一页
上一篇:插入时寻找空闲块的步骤篇(ASSM表空间)晶晶实验1 下一篇:DDL和DML操作都加什么样的TM锁篇晶晶实验三

power by soyo123 2007-2008