Oracle中发生行迁移或行链接之后
如果这行数据为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.
假设现在block A在segment的freelist中,再假设插入/更新数据时,block A发生了行迁移或者行链接,那么block A还在freelist中么?
我觉得是不是所有的的block最终都会产生一个行链接,因为如果pctused=60%,那么已使用的空间不可能恰好是60%吧,肯定是多一点或者少一点
如果多一点,那么已经产生了行链接,
如果少一点,那么下次会产生行链接.
是这样么?
我觉得是不是所有的的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%,才会发生行连接。
就像 有人问我:你觉得红色的石头硬,还是蓝色的石头硬?
颜色跟这个石头的硬度,恕我实在想不出必然联系来。
我建议先看看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/