Oracle DBA基础教程
上QQ阅读APP看书,第一时间看更新

4.4 理解高水位线(HWM)

对于表段使用术语“高水位线”来标记使用过的数据块的边界,如下所示。

    |1|2|3|4|……|10000|未用。

此时第10000个数据块就是这个表段的高水位线所在。

对于新建的表,高水位线位于第一个块,随着时间的推移,在这些表段中存入数据,高水位线会随之移动。如果删除了表中的数据,此时某些数据块即使为空不再包含数据,但是依然保持高水位线的高度,但是在发生表重建、TRUNCATE以及SHINK时会调整高水位线,调整后的高水位线下的数据块都包含数据。

假设有一个超大的表,我们删除其中90%的数据,但是高水位线没有调整,如果对该表进行了全表扫描,此时依然会对删除前的所有数据块进行扫描,依然会花费很多时间。这里是想告诉读者,高水位线HWM是Oracle访问数据实现全表扫描的数据块范围。

如果使用TRUNCATE而不是DELETE删除表中的所有数据,此时会调整高水位线到表段的第一个数据块。

ASSM中的HWM(自动断空间管理 Automatic Segment Space Management,High Water Mark)的管理更加细致。对于ASSM,Oracle维护着一个低HWM,它的含义是低HWM之前的所有数据块都是有数据的,可以直接读取,而低HWM之后到HWM之间的所有数据需要慎重对待,这部分数据块有可能已经格式化,有可能还没有被格式化使用,此时需要参考ASSM的位图查看数据块使用情况。

    |1|2|3|4|……|10000|……|15000| 使用|未用|18000
                         |                |
                         低HWM       HWM

15000为低HWM,18000为高HWM,在高低之间是一个“灰色”区域,Oracle会慎重对待,通过ASSM的位图查看数据块使用情况。而15000之前的所有数据块不再做这种“慎重”考察,而是直接读取使用。