向大师致敬,向大师学习!!!

Hwm (high water mak) 高水位印

上一篇 / 下一篇  2008-04-07 10:54:29 / 个人分类:数据库(oracle)

Hwm (high water mak) 高水位印

Hwmoracle 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的第一个块用于存放断头信息,freelisthwm的相关信息,也存放在这里面,类似于

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=41Card=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=2Card=1)

  1   0  SORT (AGGREGATE)

  2   1    TABLE ACCESS (FULL) OF 'T' (Cost=2Card=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


TAG: hwm oracle 高水位印

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar