Oracle中发生行迁移或行链接- pctfree-pctused

Oracle中发生行迁移或行链接之后

假设现在block A在segment的freelist中,再假设插入/更新数据时,block A发生了行迁移或者行链接,那么block A还在freelist中么?
我觉得是不是所有的的block最终都会产生一个行链接,因为如果pctused=60%,那么已使用的空间不可能恰好是60%吧,肯定是多一点或者少一点
如果多一点,那么已经产生了行链接,
如果少一点,那么下次会产生行链接.
是这样么?
-------------------------------------------------------------------------------------------------------------------------------------------------------'
 
因为pctfree、pctused不是界定行链接和行迁移的条件,你插入的数据可以多点使剩余空间小于pctfree,只要剩余空间还有,就不会产生迁移。

--------------------------------------------
 
pctused跟行连接行迁移没有直接联系,所以我说可以在,也可以不在。
就像 有人问我:你觉得红色的石头硬,还是蓝色的石头硬?
颜色跟这个石头的硬度,恕我实在想不出必然联系来。
我建议先看看pctused和pctfree的概念,然后在看看row chaining和row migration的概念。
而且,row chaining和row migration也是两种意思,前者主要是由于insert过长的行造成的,后者主要是因为update更长的行所造成的。
所以,我这里猜测你其实是想说row migration吧。
其次,row migration跟pctused实在没啥联系,
在这里,我继续猜测你其实是想说的pctfree吧。
pctfree的概念:The percentage of space reserved for future update of existing data.
pctused的概念: The percentage of minimum space used for insertion of new row data.
This value determines when the block gets back into the FREELISTS structure.

当pctfree的空间不足以容纳下新update的一行较之原来这行多出来的部分时,row migration发生。

回到你最初的问题,
“我觉得是不是所有的的block最终都会产生一个行链接,因为如果pctused=60%,那么已使用的空间不可能恰好是60%吧,肯定是多一点或者少一点
如果多一点,那么已经产生了行链接,
如果少一点,那么下次会产生行链接.

使用空间>pctused,这个块为什么一定发生了行连接呢?pctused他代表的是当原来这个块不在freelist上,然后由于这个块上的数据经过delete或者更小的update,使用率低于了60%的这一刹那,oracle将这个块放回到freelist上。所以,当一个块使用空间>pctused时,这个块可能在freelist上,也可能不在。而这个块到底在不在freelist上跟行连接也没有任何必然联系。


对于你的“还有可以查看segment中的freelist列表么?”
答案是可以的。
方法就是dump segment header。

SQL> select FILE_ID,BLOCK_ID from dba_extents where segment_name='HAO' and WNER='SYS' order by 1,2
  2  ;

   FILE_ID   BLOCK_ID
---------- ----------
         1      35945
         1      35953
         1      35961
         1      35969
         1      36321

SQL> alter system dump datafile 1 block 35945;

System altered.

SEG LST:: flg: USED   lhd: 0x00408de3 ltl: 0x00408c6a
lhd(list header)表示位于该list中的第一个可用block的dba(Data block address)
ltl(list tail)表示位于该list中的最后一个可用block的dba,这个block必定位于HWM之下。

0x00408de3 十进制显示时4230627
0x00408c6a 十进制显示时4230250
SQL> select dbms_utility.data_block_address_file(4230627) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(4230627)
---------------------------------------------
                                            1

SQL> select dbms_utility.data_block_address_file(4230250) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(4230250)
---------------------------------------------
                                            1

SQL> select dbms_utility.data_block_address_block(4230627) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(4230627)
----------------------------------------------
                                         36323

SQL> select dbms_utility.data_block_address_block(4230250) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(4230250)
----------------------------------------------
                                         35946

所以这样就得到这个segment freelist的头和尾了。由于他是list,所以在每个freelist上的block的最后会有指针指向下一个freelist上的block。


对于
“剩余空间不够,不就是产生行链接么,pctused就是用来判断block空间是否足够的,不是么?”
一个block的剩余多少作为reserved空间,是由pctfree决定的。这属于把这两个参数搞混了。
而且即使一个block的空闲率小于了pctfree的值,那么也跟这个块是不是有row migration没有关系。
比如说当前这个block使用率是50%,pctfree我设的40%,那么当我update这个块的一行后,使其block空间使用率变成了80%,但这时这个block没有发生行连接啊。只有当我update这行,使这个block的使用率大于了100%,才会发生行连接。

 

 

insert 过程: a block

pctused: 50%

present used: 45%

a new data insert:

                  10%    this blcok

                   60%    entire into next blcok

                   110%   100% the entire into next block

                              10% into the next next block


     如果这行数据为52%,那么,该行移到下一个足够放下52%的block里占用52%的空间。这中情况下并没有row chainning产生.

     row chainning的产生肯定是该行数据大于data block的100%容量.

     那么oracle应该在data block的row directory里面记录该data block之前是否已经被插入数据行.

     如果这个data block之前已经被insert数据行了,那么再次insert,肯定不会产生row chainning.

     如果这个data block之前没有insert数据行,那么insert,才可能产生row chainning.
 
 
 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-606646/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13165828/viewspace-606646/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值