`
tylgl
  • 浏览: 55988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hwm (high water mak) 高水位印

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

段空间的管理方式
1:fml freelist management ,segment hwm下所有可用的快使用freelist来管理,freelist位于第一个extent中。一个block是否位于freelist取决于pctfree和pctused,当需要块空间的时候,会进入freelist链表中寻找。因此,当对该segment频繁的进行dml的时候,会产生竞争,这时可以采用增加freelist和freelist 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,一个extent有8个block,第一个中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

2:assm 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的影响

oracle在delete的时候,并不会立即的收缩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
d:exp/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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics