研究了好久 low HWM到底是个什么东西,存在的意义是什么,最后终于明悟了。low HWM是为了全表扫描的时候提高性能(也许还有其它的作用)。
low HWM 存在与ASSM中。 当HWM上移之后, low HWM就会跑到之前HWM那个位置。我们知道HWM上移就意味着之前的空间已经不够了,也就是说HWM下面的空间都写满了。所以,我们可以知道,low HWM下面的空间都是写满了的。
这样做有什么意义呢?
意义在于low HWM和HWM中间这一部分空间。 这一部分空间在ASSM中是用一块写一块,也就是说有些块是没有经过format的。这种块读起来很危险,所以在全表扫描的时候,oracle要检查这些块,看它是format过的还是没有format过的。 那么说到底low HWM的意义到底是什么呢?
我们假设不使用low HWM。
这样就是说在HWM之下存在着两种块 1. format过的 2.没有format过的
oracle在做全表扫描的时候要避开没有format过的块,因为这些块不可读,所以必须先去check每个块是format的还是没有format的。这样的开销相当的大。为了减少开销,我们引入了low HWM。
前面已经说过,我们可以确定low HWM下的块全都是format过的了,所以,oracle在全表扫描的时候就可以不检查low HWM之前的块,直接扫描,这样就大大减少了check的工作量,只需要check low HWM和HWM之间的块就可以了 。
不过其实有个疑点。HWM向上移的时候,一定说明HWM之前的空间都format过了吗?
有没有这样的情况,现在HWM下有1个没有format的数据块,这时来了一个request要插入2个数据块大小的数据,所以HWM根据政策上移了5,而low HWM就上移到原来HWM的位置,可是。。。 这样不是就说明low HWM下面有一个没有format的数据块了吗。难道说low HWM都是在HWM上移之后,数据也插入之后才上移的?