本文主要说明什么是hwm(高水位标志)?通过实验的方法探究oracle数据库数据段的high water mark 怎样移动及其对数据库性能的影响,并深入研究两种收缩hwm的方法。
high water mark(HWM)是oracle数据库中关于段的一个重要的概念,表示段中使用过的空间和未使用过的空间的分界线。当请求新的数据块时,如果空闲列表中的块不能满足要求时,hwm指向的块标记为已使用,然后hwm向后移动,指向下一个未使用过的块。
在oracle数据库中,block是数据存储的最小单位,段(segment)是由多个块组成,block的状态分为已使用和未使用两种,一般来说,在hwm之下的block都是存储过数据的。下图是关于段的描述:
header Block | datarow |
Block High water mark
Segment中block的分布
从上图可以看到,一个segment中block的分布情况。在hwm左边的block是已经使用过的,可以存储数据。在hwm右边的block不能存储数据。当hwm左边的block使用完以后,要存储新的数据时,oracle向右移动hwm,在freelist中增加可用的块。
Oracle段中块的管理有两种方式,一种是freelist,主要在oracle8i之前使用,由于freelist管理的段,对于并发度高的数据段,会造成数据段头的竞争,严重影响数据库的性能。在oracle9i以后,oracle提出auto segment space management(assm)即自动段空间管理,并逐步取代freelist管理方式。Assm使用bitmap的管理方式。
本文以实验为基础,讨论hwm在数据段中的移动情况,及其对数据库性能的影响。
1.对于初始创建的table的hwm讨论
刚建好table时,表中没有数据。
1.1先探究freelist管理的数据段
构建实验环境,首先建立一个表空间flm,段管理为freelist。
create tablespace flm
datafile 'D:ORACLEPRODUCT10.2.0ORADATATSflm.dbf'
size 20m
extent management local
segment space management manual;
在该表空间上建数据表flm_hwm
SQL> create table flm_hwm(a number,b number)
tablespace FLM
storage(minextents 2)
pctfree 40
pctused 20;
通过以下查询可知为FLM_HWM最初分配的extents数
SQL> select count(*) from dba_extents
2 where segment_name='FLM_HWM';
COUNT(*)
----------
2
在sqlplus中执行show_space过程,可以看到FLM_HWM中block的使用情况:
SQL> set serveroutput on
SQL> execute show_space('FLM_HWM','SYS');
Free Blocks.............................0
Total Blocks............................256
Total Bytes.............................2097152
Unused Blocks...........................255
Unused Bytes............................2088960
Last Used Ext FileId....................12
Last Used Ext BlockId...................9
Last Used Block.........................1
从以上输出可以看到,有255个未使用的块,表中的第一个块用作数据段头(header block),此时,hwm位于第二个块上。
另外,还可以使用转储(DUMP)段头数据块的方法看到hwm的位置:
先使用以下查询获知FLM_HWM的位置:
SQL> select EXTENT_ID,FILE_ID,BLOCK_ID,RELATIVE_FNO
from dba_extents
where SEGMENT_NAME='FLM_HWM';
EXTENT_ID FILE_ID BLOCK_ID RELATIVE_FNO
---------- ---------- ---------- ------------
0 12 9 12
1 12 137 12
从以上查询可以得知表FLM_HWM位于文件file 12的9块处。其中block 9为Header block,Dump该块:
SQL> alter system dump datafile 12 block 9;
转储内容保存在该会话的跟踪文件中,摘取其中的有关内容:
Start dump data blocks tsn: 14 file#: 12 minblk 9 maxblk 9
buffer tsn: 14 rdba: 0x03000009 (12/9)
scn: 0x0000.06dcda62 seq: 0x01 flg: 0x04 tail: 0xda621001
frmt: 0x02 chkval: 0x2fa0 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x078F2200 to 0x078F4200
78F2200 0000A210 03000009 06DCDA62 04010000 [........b.......]
78F2210 00002FA0 00000000 00000000 00000000 [./..............]
78F2220 00000000 00000002 000000FF 00001020 [............ ...]
78F2230 00000000 00000000 0000007F 0300000A [................]
78F2240 00000000 00000000 00000000 00000000 [................]
78F2250 00000000 00000000 00000000 00000002 [................]
78F2260 00000000 0000CFB2 40000000 0300000A [...........@....]
78F2270 0000007F 03000089 00000080 00000000 [................]
78F2280 00000000 00000000 00000000 00000000 [................]
Repeat 250 times
78F3230 00000000 00010000 00010001 00000000 [................]
78F3240 00000000 00000000 00000000 00000000 [................]
Repeat 250 times
78F41F0 00000000 00000000 00000000 DA621001 [..............b.]
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 2 #blocks: 255 last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x0300000a ext#: 0 blk#: 0 ext size: 127
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 2 obj#: 53170 flag: 0x40000000
Extent Map
----------------------------------------------------------------
0x0300000a length: 127
0x03000089 length: 128
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9599/viewspace-472883/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9599/viewspace-472883/