高水位线和全表扫描

   高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式。高水位线对全表扫描方式有着至关重要的影响。当使用delete 操作
表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。本文给出高水位线的描述,如何降低高水位线,以及高水
位线对全表扫描的影响。

 

一、何谓高水位线
    如前所述,类似于水库中储水的水位线。只不过在数据库中用于描述段的扩展方式。
    可以将数据段或索引段等想象为一个从左到右依次排开的一系列块。当这些块中未填充任何数据时,高水位线位于块的最左端(底端)
    随着记录的不断增加,新块不断地被填充并使用,高水位线随之向右移动。高水位线之上为未格式化的数据块。
    删除(delete)操作之后,高水位线之下的块处于空闲状态,但高水位线并不随之下降,直到重建,截断或收缩表段。
    全表扫描会扫描高水位线之下的所有块,包括空闲数据块(执行了delete操作)。
    
    低高水位线
      是在使用ASSM时的一个概念。即使用ASSM时除了高水位线之外,还包括一个低高水位线。低高水位线一定是位于高水位线之下。
      当段使用MSSM管理方式时只有一种情况即只存在一个高水位线。
      使用MMSM时,当HWM升高时,Oracle立即格式化所有块且有效,并可以安全读取。仅当第一次使用时完成格式化,便于安全读取数据。
      使用ASSM时,当HWM升高时,Oracle并不会立即格式化所有块。仅当第一次使用时完成格式化,便于安全读取数据。
      使用低高水位线可以减少当全面扫描表段时,低高水位线与高水位线之间不安全块的检查数量。即低高水位线之下的块不再检查。
   
二、演示高水位线与全表扫描

三、总结
  1、高水线直接决定了全表扫描所需要的I/O开销
  2、delete操作不会降低高水位线,高水位线之下的所有块依然被扫描
  3、使用truncate 会重置高水位线到0位
  4、定期使用alter table tab_name shrink space cascade 有效减少该对象上的I/O开销
  
四、延伸参考
  收缩表段(shrink space) 

  dbms_xplan之display_cursor函数的使用 
  dbms_xplan之display函数的使用 
  执行计划中各字段各模块描述 
  Oracle 绑定变量窥探 
  Oracle 自适应共享游标  
  Oracle ROWID 

  

posted @ 2011-11-08 18:15  生活不是用来挥霍的  阅读(308)  评论(0编辑  收藏  举报