ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Hwm (high water mak) 高水位印

Hwm (high water mak) 高水位印

原创 Linux操作系统 作者:oracle_kai 时间:2008-04-07 10:54:29 0 删除 编辑

Hwm (high water mak)  高水位印

Hwm oracle segment 中的一个比较重要的参数,它代表了该segment中曾经使用过的最大块空间,oracle把已经分配给该段的块分为2部分,一部分是已经或者说曾经使用到的最大空间,另一部分是已经分配给该段,但尚未被格式化,不能直接使用的部分,而hwm就是这2部分的分界线,oracle在需要新的空间的时候,先在hwm以下的块中寻找空间,如果空间不能满足,则使用hwm指向的快,然后hwm移动指向下一个块。

 

段空间的管理方式

1fml freelist management ,segment hwm下所有可用的快使用freelist来管理,freelist位于第一个extent中。一个block是否位于freelist取决于pctfreepctused,当需要块空间的时候,会进入freelist链表中寻找。因此,当对该segment频繁的进行dml的时候,会产生竞争,这时可以采用增加freelistfreelist groups

新建一个segment的时候,第一个extent 的第一个块用于存放断头信息,freelist hwm的相关信息,也存放在这里面,类似于

buffer tsn: 0 rdba: 0x0040c661 (1/50785)

scn: 0x0000.0066c205 seq: 0x02 flg: 0x00 tail: 0xc2051002

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::  0x0040c662  ext#: 0      blk#: 0      ext size: 7   

--file=1 blcok=50786,即第二个block

  #blocks in seg. hdr's freelists: 0    

  #blocks below: 0    

  mapblk  0x00000000  offset: 0     Unlocked

     Map Header:: next  0x00000000  #extents: 1    obj#: 30790  flag: 0x40000000

  Extent Map

  -----------------------------------------------------------------

   0x0040c662  length: 7    

--初始分配一个extent,一个extent8block,第一个中block用于存放段头信息,这样,第一个extent中将剩余7个块可供使用

  nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 0

  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

End dump data blocks tsn: 0 file#: 1 minblk 50785 maxblk 50785

 

2assm auto segment space management ,9i开始,在lmt表空间中,可以选择使用assm方式的段空间管理,该方式下,用位图取代freelist,用位图来管理段中的快的使用情况,为该段指定的pctused,next,freelist 参数都将被忽略掉。

新建一个segment的时候,第一个extent 的至少是三个块用于存放断头信息,类似于

Start dump data blocks tsn: 9 file#: 9 minblk 9 maxblk 9

buffer tsn: 9 rdba: 0x02400009 (9/9)

scn: 0x0000.0066eedf seq: 0x02 flg: 0x00 tail: 0xeedf2002

frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

 --------------------------------

    Locker xid:     :  0x0000.000.00000000

Highwater::  0x0240000c  ext#: 0      blk#: 3      ext size: 8    

--0x0240000c =file 9 blcok 12,即前三个块用户存放段头信息

  DBA Ranges :

  --------------------------------------------------------

   0x02400009  Length: 8      Offset: 0     

   0:Metadata   1:Metadata   2:Metadata   3:unformatted

   4:unformatted   5:unformatted   6:unformatted   7:unformatted

  --------------------------------------------------------

End dump data blocks tsn: 9 file#: 9 minblk 9 maxblk 9

 

 

高水位印以下空间的回收

 

高水位线的对full table scan 的影响

 

oracledelete的时候,并不会立即的收缩hwm,这样,在对此表做full table scan 的时候,oracle会扫描hwm下的所有记录,即使有些块是空快,也照样读取,如果一个表,频繁的delete,而hwm又不能收缩,或者说hwm下面的块空间不能充分填充数据,这样就可能带来性能问题。

 

CREATE TABLE T AS SELECT * FROM DBA_OBJECTS;

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SYS',TABNAME=>'T');

PL/SQL procedure successfully completed

SQL> EXEC SHOW_SPACE('T');

Total Blocks............................512

Total Bytes.............................4194304

Unused Blocks...........................106

Unused Bytes............................868352

Last Used Ext FileId....................1

Last Used Ext BlockId...................51849

Last Used Block.........................22

HWM= Total Blocks- Unused Blocks+1=407,HWM此时位于第407块。

SQL> DELETE T;

SQL> SELECT COUNT(*) FROM T;

  COUNT(*)

----------

         0

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=1)

   1    0   SORT (AGGREGATE)

   2    1     TABLE ACCESS (FULL) OF 'T' (Cost=41 Card=1)

 

如何降低高水位线

a:用truncate 代替delete

b:用move命令,但需要重新rebuild index

c:如果是assm方式,可以采用shrink 命令,不需要rebuild index

dexp/imp

SQL> alter table t move tablespace system;

 

SQL> exec show_space('T');

Total Blocks............................8

Total Bytes.............................65536

Unused Blocks...........................7

Unused Bytes............................57344

Last Used Ext FileId....................1

Last Used Ext BlockId...................52145

Last Used Block.........................1

HWM= Total Blocks- Unused Blocks+1=2,HWM此时位于第2块。

SQL> ANALYZE TABLE T COMPUTE STATISTICS;

表已分析。

SQL> SELECT COUNT(*) FROM T;

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1)

   1    0   SORT (AGGREGATE)

   2    1     TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1)

 

HWM以上空间的回收

 

做完analyze 后,DBA_TABLES 中的empty_blocks表示hwm以上的空间,对于这部分空间的回收,可以用 Alter  table t deallocate unused 命令;

SQL> Select owner,table_name,blocks,empty_blocks From DBA_TABLES Where WNER='SYS' And TABLE_NAME='T';

OWNER               TABLE_NAME                BLOCKS     EMPTY_BLOCKS

------------------------------ ------------------------------ ---------- ------------

SYS                            T                       403          108

SQL> ALTER TABLE T DEALLOCATE UNUSED;

SQL> ANALYZE TABLE T COMPUTE STATISTICS;

SQL> Select owner,table_name,blocks,empty_blocks From DBA_TABLES Where WNER='SYS' And TABLE_NAME='T';

OWNER               TABLE_NAME             BLOCKS          EMPTY_BLOCKS

------------------------------ ------------------------------ ---------- ------------

SYS                            T                   403            4

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

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

注册时间:2007-12-20

  • 博文量
    48
  • 访问量
    172450