首页 > Linux操作系统 > Linux操作系统 > 高水标记的研究(1)
之前的高水标记的实验是初学时的日志,本文是对高水标记稍深一点的探寻。
本地管理的表空间的段空间管理分为手动段空间管理和自动段空间管理(ASSM),我想分两种场景探寻高水标记,本文是有关手动段空间管理中的高水标记
1 高水标记记在哪
根据高水标记概念的描述,我猜想高水标记应该记录在段上的第一个块上,即段头上
SQL> create table t(x int,y varchar2(1000));
表已创建。
SQL> insert into t select rownum,lpad('a',999) from dba_objects where rownum<50;
已创建49行。
SQL> commit;
提交完成。
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
14 10 7
14 11 7
14 12 7
14 13 7
14 14 7
14 15 7
14 16 7
已选择7行。
SQL> select t.header_file,t.header_block from dba_segments t where t.owner='SCOT
2>T' and t.segment_name='T'
HEADER_FILE HEADER_BLOCK
----------- ------------
14 9 –第一块是14文件上的9块
SQL> alter system dump datafile 14 block 9;
系统已更改。
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x03800011 ext#: 0 blk#: 7 ext size: 7
#blocks in seg. hdr's freelists: 1
#blocks below: 7
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 1 obj#: 31533 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
Highwater:: 0x03800011 就是高水标记
通过以下的sql,看看0x03800011表明当前的标记在17块
SQL> select dbms_utility.DATA_BLOCK_ADDRESS_FILE(to_number('3800011','xxxxxxxxxx
xxxxx')) file#
2 ,dbms_utility.DATA_BLOCK_ADDRESS_BLOCK(to_number('3800011', 'xxxxxxxxxxxxxx
x')) block#
3 from dual;
FILE# BLOCK#
---------- ----------
14 17
2 delete后高水标记是否改变
将块16上的数据删除
SQL> delete from t where x>42;
已删除7行。
SQL> alter system dump datafile 14 block 9;
系统已更改。
Highwater:: 0x03800011 ,高水标记并没有改变
删除所有数据
SQL> delete from t;
已删除42行。
SQL> alter system dump datafile 14 block 9;
系统已更改。
Highwater:: 0x03800011 ,高水标记还是没有改变
SQL> truncate table t;
表已截掉。
SQL> alter system dump datafile 14 block 9;
系统已更改。
Highwater:: 0x0380000a,高水标记变了
SQL> select dbms_utility.DATA_BLOCK_ADDRESS_FILE(to_number('0380000a','xxxxxxxxx
xxxxxx')) file#
2 ,dbms_utility.DATA_BLOCK_ADDRESS_BLOCK(to_number('0380000a', 'xxxxxxxxxxxxx
xx')) block#
3 from dual;
FILE# BLOCK#
---------- ----------
14 10 ---高水标记改变到10块上
3 insert高水标记如何变化
看看两种情况
插入59条记录:
SQL> insert into t select rownum,lpad('a',999) from dba_objects where rownum<60
已创建59行。
SQL> commit;
提交完成。
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
14 10 7
14 11 7
14 12 7
14 13 7
14 14 7
14 15 7
14 16 7
14 17 7
14 18 3
已选择9行。
此时的Highwater:: 0x03800016---在块22上
truncate table,插入29条记录:
SQL> truncate table t;
表已截掉。
SQL> insert into t select rownum,lpad('a',999) from dba_objects where rownum<30;
已创建29行。
SQL> commit;
提交完成。
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
14 10 7
14 11 7
14 12 7
14 13 7
14 14 1
此时的Highwater:: 0x0380000f---在块15上
为什么有时高水标记在当前数据所在块的下一块,有时却在当前数据所在块隔很多块上呢?
delete时并没有删除块上关于表t的信息,目前看当块上信息为t,并且被t的数据重新使用时,高水标记在当前数据所在块的下一块。当分配新块给t时,高水标记会跳跃5个块,这个还需要研究
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-614122/ ,如需转载,请注明出处,否则将追究法律责任。