您的位置:首页 > 其它

分析以及测试在一个segment中freelists以及HWM的变化情况(1)

2008-03-29 14:01 471 查看
在讲freelist概念之前,先了解下:
一个segment可用的空闲空间有两个来源:
1)一个是已经分配给这个segment但是从来没有用过的位于HWM(高水位标志)之上的blocks;
2)还有一个是位于HWM之下的,被链接在freelist之上的blocks;

freelist概念
freelist: 一个指定了可以用于插入操作的数据块的list。存在于这个list之上的数据块可以用于插入,一旦向这个数据块插入数据达到无法再继续插入时(即达到一个块只剩下PCTFREE参数指定的保留的空间时),则这个块表示已经不能再用于插入数据,则这个 块从freelist管理解放出来;当更新或者删除数据达到使得数据块中的已用空间低于PCTUSED参数指定的所占数据块中的空间比例时,此时这个数据块又可以重新用于插入数据,这个数据则自动链接到freelist链表上;
自己猜测:只有在当frelist中没有空间可用于插入操作时,此时才动用HWM之上的可用数据块;下面需要证明。

drop table T_MANUAL;

-- Create table
create table T_MANUAL
(
ID NUMBER,
NAME VARCHAR2(1000)
)
tablespace TS_MAMUAL
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
freelists 1
freelist groups 1
maxextents unlimited
);

create table T_MANUAL_free2
(
ID NUMBER,
NAME VARCHAR2(1000)
)
tablespace TS_MAMUAL
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
freelists 2
freelist groups 1
maxextents unlimited
);

create table T_MANUAL_freegroup2
(
ID NUMBER,
NAME VARCHAR2(1000)
)
tablespace TS_MAMUAL
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
freelists 4
freelist groups 2
maxextents unlimited
);

select t.segment_name,t.segment_type,t.freelists,t.freelist_groups
from user_segments t
where t.tablespace_name=upper('ts_mamual');

select tt.file_id,tt.block_id
from dba_extents tt
where tt.segment_name='T_MANUAL'

SEGMENT_NAME SEGMENT_TYPE FREELISTS FREELIST_GROUPS
------------------------ ------------------ ---------- ---------------
T_MANUAL TABLE 1 1
T_MANUAL_FREE2 TABLE 2 1
T_MANUAL_FREEGROUP2 TABLE 4 2

begin
show_space('T_MANUAL');
end;

Free Blocks.............................1
l_free_blks1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................9
Last Used Block.........................1
1on FREELIST,1used by table

alter system dump datafile 11 block 9

T_MANUAL表
*** SESSION ID:(8.30) 2008-03-29 10:24:42.511
Start dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 9
buffer tsn: 13 rdba: 0x02c00009 (11/9)
scn: 0x0000.0017d666 seq: 0x02 flg: 0x00 tail: 0xd6661002
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02c0000a ext#: 0 blk#: 0 ext size: 7 --Highwater:: 0x02c0000a
#blocks in seg. hdr's freelists: 0 --表示位于freelist中的数据块有0块
#blocks below: 0 --表示在高水位标志(HWM)下的数据块也为0
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 1 obj#: 32098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x02c0000a length: 7

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 0
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
End dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 9
分析:还没有插入数据,尽管定义的freelist为1,freelist group为1,但是
#blocks in seg. hdr's freelists: 0 --表示位于freelist中的数据块有0块
#blocks below: 0 --表示在高水位标志(HWM)下的数据块也为0
说明这个表的segmemt还没有投入使用,并且有
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
flg: UNUSED:也表示freelist还没有使用;

insert into T_MANUAL values(1,'aaaa');
begin
show_space('T_MANUAL');
end;

Free Blocks.............................1
l_free_blks1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................9
Last Used Block.........................2
1on FREELIST,1used by table

向下面是T_MANUAL表插入数据insert into T_MANUAL values(1,'aaaa')之后的dump内容如下:
*** 2008-03-29 11:10:57.742
Start dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 10
buffer tsn: 13 rdba: 0x02c00009 (11/9)
scn: 0x0000.0017d9c4 seq: 0x01 flg: 0x00 tail: 0xd9c41001
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02c0000b ext#: 0 blk#: 1 ext size: 7 --Highwater:0x02c0000b发生了变化,由原来的0x02c0000a
变为0x02c0000b
#blocks in seg. hdr's freelists: 1 --此处与插入数据之前比较,由0转变为1,说明插入一条数据插入之后freelist开始投
--入使用来管理位于HWM之下的空闲空间。
#blocks below: 1 --此处与插入数据之前比较,也由0转变为1:说明由于数据的插入,使得HWM上升,表示
--位于HWM之下的数据块也有1块
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 1 obj#: 32098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x02c0000a length: 7

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1
SEG LST:: flg: USED lhd: 0x02c0000a ltl: 0x02c0000a
buffer tsn: 13 rdba: 0x02c0000a (11/10)
scn: 0x0000.0017d9c5 seq: 0x01 flg: 0x02 tail: 0xd9c50601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c0000a
Object id on Block? Y
seg/obj: 0x7d62 csc: 0x00.17d9c4 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.013.0000053c 0x0080041d.005b.1d --U- 1 fsc 0x0000.0017d9c5
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xad7c05c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x0ad7c05c
bdba: 0x02c0000a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f95
avsp=0x1f81
tosp=0x1f81
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f95
block_row_dump:
tab 0, row 0, @0x1f95
tl: 11 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 4] 61 61 61 61
end_of_block_dump
End dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 10

Block header dump: 0x02c0000a
Object id on Block? Y
seg/obj: 0x7d62 csc: 0x00.17d9c4 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
分析:
flg: O:表示这个block在freelist上;
typ: 1:为Block type: 占用1byte。1=data; 2=index
fsl: 0 :Interested Transaction Slot (ITS) freelist slot(fsl): 占用1byte。Index to the first slot on the ITL freelist
fnx: 0x0:Next freelist block(fnx): 占用4byte。Segment freelist中下一个block的RDBA(Tablespace relative database block
address)
SEG LST:: flg: USED lhd: 0x02c0000a ltl: 0x02c0000a
分析:flg: USED :表示freelist处于使用中;
lhd: 0x02c0000a:表示在freelist中第一个可用的数据块的地址;
ltl: 0x02c0000a:表示在freelist链表中最后有个可用的数据快的地址;

继续插入数据:
insert into T_MANUAL values(1,'bbbb');
begin
show_space('T_MANUAL');
end;

Free Blocks.............................1
l_free_blks1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................9
Last Used Block.........................2
1on FREELIST,1used by table

alter system dump datafile 11 block min 9 block max 10;

*** 2008-03-29 12:40:08.235
Start dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 10
buffer tsn: 13 rdba: 0x02c00009 (11/9)
scn: 0x0000.0017d9c4 seq: 0x01 flg: 0x04 tail: 0xd9c41001
frmt: 0x02 chkval: 0x398a type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02c0000b ext#: 0 blk#: 1 ext size: 7
#blocks in seg. hdr's freelists: 1
#blocks below: 1
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 1 obj#: 32098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x02c0000a length: 7

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1
SEG LST:: flg: USED lhd: 0x02c0000a ltl: 0x02c0000a
buffer tsn: 13 rdba: 0x02c0000a (11/10)
scn: 0x0000.0017e1c2 seq: 0x01 flg: 0x02 tail: 0xe1c20601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c0000a
Object id on Block? Y
seg/obj: 0x7d62 csc: 0x00.17e1c0 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.000.000004a4 0x00800aec.0056.0b C--- 0 scn 0x0000.0017dbc2
0x02 0x0003.028.00000530 0x00800a6d.00ba.2c --U- 1 fsc 0x0000.0017e1c2
End dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 10

分析:SEG LST:: flg: USED lhd: 0x02c0000a ltl: 0x02c0000a相比较前一次插入,没有发生变化;

继续插入10条记录,
declare
a char(1000);
begin
a:='a';
for i in 10..20 loop
insert into T_MANUAL
values(i,a);
commit;
end loop;
end;

begin
show_space('T_MANUAL');
end;

Free Blocks.............................1
l_free_blks1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................5
Unused Bytes............................40960
Last Used Ext FileId....................11
Last Used Ext BlockId...................9
Last Used Block.........................3
1on FREELIST,2used by table

*** 2008-03-29 12:47:11.951
Start dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 11
buffer tsn: 13 rdba: 0x02c00009 (11/9)
scn: 0x0000.0017e232 seq: 0x02 flg: 0x00 tail: 0xe2321002
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x02c0000c ext#: 0 blk#: 2 ext size: 7
#blocks in seg. hdr's freelists: 1
#blocks below: 2
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 1 obj#: 32098 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x02c0000a length: 7

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 2
SEG LST:: flg: USED lhd: 0x02c0000b ltl: 0x02c0000b
buffer tsn: 13 rdba: 0x02c0000a (11/10)
scn: 0x0000.0017e232 seq: 0x02 flg: 0x00 tail: 0xe2320602
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c0000a
Object id on Block? Y
seg/obj: 0x7d62 csc: 0x00.17e232 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.025.00000530 0x00800a6d.00ba.2d C--- 0 scn 0x0000.0017e231
0x02 0x0002.010.0000054f 0x00800343.005a.27 C--- 0 scn 0x0000.0017e22f
End dump data blocks tsn: 13 file#: 11 minblk 9 maxblk 11

分析: Highwater:: 0x02c0000c ext#: 0 blk#: 2 ext size: 7
#blocks in seg. hdr's freelists: 1 --freelist链表上还是一个数据块
#blocks below: 2 --此时由于数据的插入以至一个数据块存放不下,此时需要行链接,新增加一个数据块
--这样HWM上移,HWM标志下有两个数据块;
SEG LST:: flg: USED lhd: 0x02c0000b ltl: 0x02c0000b
此时的lhd为0x02c0000b,比在插入之前的lhd: 0x02c0000a发生的变化,主要是因为原来的freelist上的那个数据块已经不允许再
插入数据,已经不由freelist链表管理,已经从freelist来年表中释放出去;此时在HWM下的新加进来的数据块由于插入数据还没有
达到PCTFREE参数指定的空间限制,所以该数据块被链接到freelist链表中,所以lhd地址发生了变化;
可以将lhd: 0x02c0000a地址转化为fileID以及BlockID来显示它表示用的是哪个文件以及哪个数据块:
在插入之前的lhd: 0x02c0000a,0x02c0000a这个是16进制,转化为10进制为46137354,则通过下面:
select dbms_utility.data_block_address_file(46137354) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
11
select dbms_utility.data_block_address_block(46137354) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
10
上面可以看出原来的freelist中唯一的一个数据块是用的文件11数据块10,下面再继续看更改后的:
更改后的lhd为0x02c0000b,0x02c0000b转化为10进制为46137355,则
SQL> select dbms_utility.data_block_address_file(46137355) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
11
SQL> select dbms_utility.data_block_address_block(46137355) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
11
freelist链表中的数据块发生变化,是用的文件11数据块11。
seg/obj: 0x7d62 csc: 0x00.17e232 itc: 2 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
fnx为0x0:表示下面没有可用的空闲的数据块,即已经到freelist链表的最后一个空闲数据块。

回答我最初的猜测:

确实当只有在当frelist中没有空间可用于插入操作时,此时会发生行链接从而新增了个数据块,使得HWM标志上升 ,同时freelist链表中的可用数据块也发生了改变,而不原来的是数据块.

以上是对freelists=1以及freelistgroups=1的表进行的对freelist以及HWM的变化情况的分析,
下面对freelists=2以及freelistgroups=1的表进行的对freelist以及HWM的变化情况的分析:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: