您好,欢迎访问一九零五行业门户网

ORACLE空间管理实验5:块管理之ASSM下高水位的影响

高水位概念: 所有的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
其它类似信息

推荐信息