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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值