高水位概念: 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为high water mark或hwm。这个hwm是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。hwm原则
高水位概念:
所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为high water mark或hwm。这个hwm是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。hwm原则上hwm只会增大,不会缩小,即使将表中的数据全部删除,hwm还是为原值,由于这个特点,使hwm很象一个水库的历史最高水位,这也就是hwm的原始含义。
这个概念百度下一大把,可以参考:
http://www.blogjava.net/decode360/archive/2009/07/14/287767.html
http://www.cnblogs.com/linjiqin/archive/2012/01/15/2323030.html
高水位与低高水位:低高水位与高水位之间存在的数据块的状态可能是未格式化或格式的。低高水位以下的是格式化了的,可以被使用。
hwm对数据库的操作有如下影响:
1.全表扫描通常要读出直到hwm标记的所有的属于该表数据库块,即使该表中没有任何数据。
3.即使hwm以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用hwm以上的数据块,此时hwm会自动增大。
2.插入时,默认只能插入到高水位以下的数据块,这在高并发时可能引起热块从而导致性能问题。
下面就通过实验来验证一下:
全表扫描通常要读出直到低高水位hwm标记的所有的属于该表数据库块,即使该表中没有任何数据--delete来测试。truncate会释放。
解决方法有:expdp/impdp,shrink:需要在assm且表开启行移动。move不支持在线,或者crteate table a as,再删除原表,将新表改为原名。。
#################################################
1. delete不会改变高水位,但是删除后对表做shrink操作可以回收空间,降低高水位bys@ bys3>create table test12 as select * from dba_objects;
table created.
bys@ bys3>insert into test12 select * from dba_objects;
17558 rows created.
bys@ bys3>commit;
commit complete.
bys@ bys3>insert into test12 select * from test12;
35116 rows created.
bys@ bys3>commit;
commit complete.
bys@ bys3>insert into test12 select * from test12;
70232 rows created.
bys@ bys3>commit;
commit complete.
bys@ bys3>insert into test12 select * from test12;
140464 rows created.
bys@ bys3>commit;
commit complete.
bys@ bys3>alter system checkpoint; ---要做检查点
system altered.
bys@ bys3>select header_block,header_file from dba_segments where segment_name='test12' and owner='bys';
header_block header_file
------------ -----------
922 4
bys@ bys3>select sum(blocks) from dba_extents where segment_name='test12' and owner='bys';
sum(blocks)
-----------
3840
bys@ bys3>select count(extent_id) from dba_extents where segment_name='test12' and owner='bys';
count(extent_id)
----------------
45
多执行几次,取后面的平均值:
bys@ bys3>set autotrace traceonly stat
bys@ bys3>select * from test12;
280960 rows selected.
elapsed: 00:00:05.70
statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
23504 consistent gets
3710 physical reads
0 redo size
29190599 bytes sent via sql*net to client
206449 bytes received via sql*net from client
18732 sql*net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
280960 rows processed
bys@ bys3>alter system dump datafile 4 block 922;
system altered.
bys@ bys3>select value from v$diag_info where name like 'de%';
value
----------------------------------------------------------------------------------------------------
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_25994.trc
###############dump段头,查看高水位信息:highwater:: 0x01001180 --4480号块
extent control header
-----------------------------------------------------------------
extent header:: spare1: 0 spare2: 0 #extents: 45 #blocks: 3840
last map 0x00000000 #maps: 0 offset: 2716
highwater:: 0x01002100 ext#: 44 blk#: 128 ext size: 128 --高水位的dba:0x01002100,8448号块
#blocks in seg. hdr's freelists: 0
#blocks below: 3784
mapblk 0x00000000 offset: 44
unlocked
--------------------------------------------------------
low highwater mark :
highwater:: 0x01002080 ext#: 43 blk#: 128 ext size: 128 --低高水位 0x01002080
#blocks in seg. hdr's freelists: 0
#blocks below: 3712
mapblk 0x00000000 offset: 43
level 1 bmb for high hwm block: 0x01002081
level 1 bmb for low hwm block: 0x01002001
--------------------------------------------------------
segment type: 1 nl2: 1 blksz: 8192 fbsz: 0
l2 array start offset: 0x00001434
first level 3 bmb: 0x00000000
l2 hint for inserts: 0x01000399
last level 1 bmb: 0x01002081
last level ii bmb: 0x01000399
last level iii bmb: 0x00000000
map header:: next 0x00000000 #extents: 45 obj#: 23303 flag: 0x10000000
inc # 0
extent map
-----------------------------------------------------------------
0x01000398 length: 8
%……………………
0x01002080 length: 128 --最后一个l1 dba是8320号块,管理了128个块,高水位是8448号块,刚好是最后一个l1的最后一个数据块。
auxillary map
--------------------------------------------------------
extent 0 : l1 dba: 0x01000398 data dba: 0x0100039b
……………………
extent 44 : l1 dba: 0x01002080 data dba: 0x01002082 高水位应该就是这个l1管理的最后一个块:0x01002082 -8322号块,
--------------------------------------------------------
second level bitmap block dbas
--------------------------------------------------------
dba 1: 0x01000399
对表做分析后bys@ bys3>analyze table test12 compute statistics;
table analyzed.
bys@ bys3>select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='test12';
pct_free pct_used blocks avg_row_len chain_cnt
---------- ---------- ---------- ----------- ----------
10 3784 93 0
bys@ bys3>set autotrace traceonly stat
bys@ bys3>select * from test12;
280960 rows selected.
elapsed: 00:00:05.46
statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
22204 consistent gets
0 physical reads
0 redo size
29190599 bytes sent via sql*net to client
206449 bytes received via sql*net from client
18732 sql*net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
280960 rows processed
dump信息与未做表分析时相同,不贴了。
######################
delete删除表中全部数据bys@ bys3>delete test12;
280944 rows deleted.
bys@ bys3>commit;
commit complete.
bys@ bys3>alter system checkpoint;
system altered.
bys@ bys3>select header_block,header_file from dba_segments where segment_name='test12' and owner='bys';
header_block header_file
------------ -----------
922 4
bys@ bys3>select sum(blocks) from dba_extents where segment_name='test12' and owner='bys';
sum(blocks)
-----------
3840
bys@ bys3>select count(extent_id) from dba_extents where segment_name='test12' and owner='bys';
count(extent_id)
----------------
45
bys@ bys3>analyze table test12 compute statistics;
table analyzed.
bys@ bys3>select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='test12';
pct_free pct_used blocks avg_row_len chain_cnt
---------- ---------- ---------- ----------- ----------
10 3784 0 0
bys@ bys3>alter system dump datafile 4 block 922;
system altered.
bys@ bys3>select value from v$diag_info where name like 'de%';
value
----------------------------------------------------------------------------------------------------
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_26054.trc
bys@ bys3>set autotrace traceonly stat
bys@ bys3>select * from test12;
no rows selected
elapsed: 00:00:00.02
statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3721 consistent gets
2 physical reads
0 redo size
1183 bytes sent via sql*net to client
408 bytes received via sql*net from client
1 sql*net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
###############delete删除后的dump信息和上一个未删除时的没啥区别,不贴了。
delete删除后对表做shrink:--可以回收空间,降低高水位bys@ bys3>alter table test12 enable row movement;
table altered.
bys@ bys3>alter table test12 shrink space; --shrink与move,详见:shrink合并数据块--解决数据块碎片问题
table altered.
bys@ bys3>alter system checkpoint;
system altered.
bys@ bys3>select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='test12';
pct_free pct_used blocks avg_row_len chain_cnt
---------- ---------- ---------- ----------- ----------
10 3784 0 0
bys@ bys3>analyze table test12 compute statistics; 对表做分析后,tabs里的blocks信息才会变。
table analyzed.
bys@ bys3>select pct_free,pct_used,blocks,avg_row_len,chain_cnt from tabs where table_name='test12';
pct_free pct_used blocks avg_row_len chain_cnt
---------- ---------- ---------- ----------- ----------
10 1 0 0
bys@ bys3>alter system dump datafile 4 block 922;
system altered.
bys@ bys3>select value from v$diag_info where name like 'de%';
value
----------------------------------------------------------------------------------------------------
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_26432.trc
#########################dump信息如下:--可以看到空间已经回收了。高水位也已经下降
extent control header
-----------------------------------------------------------------
extent header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 8
last map 0x00000000 #maps: 0 offset: 2716
highwater:: 0x0100039c ext#: 0 blk#: 4 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 1
mapblk 0x00000000 offset: 0
unlocked
--------------------------------------------------------
low highwater mark :
highwater:: 0x0100039c ext#: 0 blk#: 4 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 1
mapblk 0x00000000 offset: 0
level 1 bmb for high hwm block: 0x01000398
level 1 bmb for low hwm block: 0x01000398
--------------------------------------------------------
segment type: 1 nl2: 1 blksz: 8192 fbsz: 0
l2 array start offset: 0x00001434
first level 3 bmb: 0x00000000
l2 hint for inserts: 0x01000399
last level 1 bmb: 0x01000398
last level ii bmb: 0x01000399
last level iii bmb: 0x00000000
map header:: next 0x00000000 #extents: 1 obj#: 23303 flag: 0x10000000
inc # 1
extent map
-----------------------------------------------------------------
0x01000398 length: 8
auxillary map
--------------------------------------------------------
extent 0 : l1 dba: 0x01000398 data dba: 0x0100039b
--------------------------------------------------------
second level bitmap block dbas
--------------------------------------------------------
dba 1: 0x01000399
end dump data blocks tsn: 4 file#: 4 minblk 922 maxblk 922
##################################
2.truncate操作直接就可以回收空间,改变高水位--但是如果非分区表,没有delete应用场景多。create table test13 as select * from dba_objects;
bys@ bys3>alter system checkpoint;
system altered.
bys@ bys3>alter system dump datafile 4 block 466;
system altered.
#############dump文件信息:
extent control header
-----------------------------------------------------------------
extent header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256
last map 0x00000000 #maps: 0 offset: 2716
highwater:: 0x010011f5 ext#: 16 blk#: 117 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 245
mapblk 0x00000000 offset: 16
unlocked
--------------------------------------------------------
low highwater mark :
highwater:: 0x010011f5 ext#: 16 blk#: 117 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 245
mapblk 0x00000000 offset: 16
level 1 bmb for high hwm block: 0x01001181
level 1 bmb for low hwm block: 0x01001181
--------------------------------------------------------
segment type: 1 nl2: 1 blksz: 8192 fbsz: 0
l2 array start offset: 0x00001434
first level 3 bmb: 0x00000000
l2 hint for inserts: 0x010001d1
last level 1 bmb: 0x01001181
last level ii bmb: 0x010001d1
last level iii bmb: 0x00000000
map header:: next 0x00000000 #extents: 17 obj#: 23300 flag: 0x10000000
inc # 0
extent map
################
做truncate操作然后dump段头
bys@ bys3>truncate table test13;
table truncated.
bys@ bys3>alter system checkpoint;
system altered.
bys@ bys3>alter system dump datafile 4 block 466;
system altered.
#########################
extent header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 8
last map 0x00000000 #maps: 0 offset: 2716
highwater:: 0x010001d3 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
disk lock:: locked by xid: 0x0002.019.00001354
--------------------------------------------------------
low highwater mark :
highwater:: 0x010001d3 ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
level 1 bmb for high hwm block: 0x010001d0
level 1 bmb for low hwm block: 0x010001d0
--------------------------------------------------------
segment type: 1 nl2: 1 blksz: 8192 fbsz: 0
l2 array start offset: 0x00001434
first level 3 bmb: 0x00000000
l2 hint for inserts: 0x010001d1
last level 1 bmb: 0x010001d0
last level ii bmb: 0x010001d1
last level iii bmb: 0x00000000
map header:: next 0x00000000 #extents: 1 obj#: 23304 flag: 0x10000000
inc # 0
extent map
-----------------------------------------------------------------
0x010001d0 length: 8
auxillary map
--------------------------------------------------------
extent 0 : l1 dba: 0x010001d0 data dba: 0x010001d3
--------------------------------------------------------
second level bitmap block dbas
--------------------------------------------------------
dba 1: 0x010001d1
