ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 高水标记的研究(1)

高水标记的研究(1)

原创 Linux操作系统 作者:ylw66 时间:2009-09-07 17:38:54 0 删除 编辑

之前的高水标记的实验是初学时的日志,本文是对高水标记稍深一点的探寻。

本地管理的表空间的段空间管理分为手动段空间管理和自动段空间管理(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博客 ” ,链接:http://blog.itpub.net/22111412/viewspace-614122/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-29

  • 博文量
    57
  • 访问量
    94474