Oracle高水位标志(High Water Mark)

    高水位标志(High Water Mark,简称为HWM)是与数据库表段相关的概念。如果把表想象成一个线性相邻的数据块序列,那么HWM就是所有保存过数据的块中最右边的那个。
    在新建的表中HWM初始时就是在第一个数据块上。随着不断插入数据并使用更多的数据块,HWM就会升高。即使删除了某些行数据(甚至是所有行数据),只要对象没有被重建(rebuild),截断(truncate)或是收缩(shrink),那么HWM依然保持在原来的位置。
    HWM之所以重要是因为Oracle在进行全表扫描(full scan)时它只会扫描位于HWM之下的所有数据块,即使HWM下没有任何数据。HWM会影响全表扫描的性能,特别是当位于HWM下的大部分块都是空块的情况。为了验证这点,我们可以创建一个包含1百万行的表,然后在该表上执行SELECT COUNT(*)操作记下一个时间。之后删除表中的所有行再次执行SELECT COUNT(*)——你会发现第二次SELECT执行时间和第一次差不多,甚至更长(如果需要进行块清除的话)。这就是因为Oracle在全表扫描时总是要读取HWM下的所有块以查看它们是否包含数据。如果你使用TRUNCATE命令而不是DELETE,那么你会发现第二次SELECT会快很多,因为TRUNCATE会重置表的HWM到0并且也会截断表上对应索引。因此如果要删除表的所有数据,你应该使用TRUNCATE命令。
    手动段空间管理模式(MSSM)下每个段都只定义了一个HWM。每当HWM升高时,所有块都是格式化好的,Oracle可以很安全地读取它们。但是在自动段空间管理模式(ASSM)中每个段除了一个HWM还有一个low HWM。当HWM升高时,Oracle不会立即为所有块进行格式化操作——它们被首次使用时才会被格式化并安全地用于读取。数据库将某条记录插入到给定块的时候就是该数据块首次被使用的时刻。在ASSM模式下,数据只会被插入到介于low HWM和HWM之间的数据块中,这样位于该区域的很多数据块都有可能是没有格式化的。因此,当全扫描一个段时,我们必须要检查要被读取的块是否是安全的还是未格式化的(即它们不包含有意义的数据因而Oracle不做处理),但我们不必为表中的所有块做这种检查,就是因为Oracle自己维护了一个low HWM和HWM。Oracle只会全扫描位于HWM之下但位于low HWM之上的所有数据块用于读取和处理。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/425993/viewspace-714881/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/425993/viewspace-714881/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值