一、ORACLE高水位线(HWM)
1.1 ORACLE用HWM来界定一个段中使用的块和未使用的块。
当我们创建一个表时, ORACLE就会为这个对象分配一个段, 在这个段中即使我们未插入任何记录, 也至少有一个区被分配, 第一个区的第一个块就称为段头块(SEGMENT_HEADER), 段头中就储存了一些信息, 其中HWM的信息就存储在此。此时, 因为第一个区的第一块用于存储段头的一些信息, 虽然没有存储任何实际的记录, 但也算是被使用, 此时HWM是位于第2个块, 当我们不断插入数据后, 第一个块已经放不下后面新插入的数据, 此时, ORACLE将高水位之上的块用于存储新增数据, 同时, HWM本身也向上移, 也就是说, 当我们不断插入数据时, HWM会不断上移, 这样, 在HWM之下的, 就表示使用过的块。 HWM之上的就表示已分配但从未使用过的块。
1.2 HWM在插入数据时, 当现有空间不足而进行空间的扩展时会向上移, 但删除数据时不会往下移。
1.3 HWM本身的信息是存储在段头, 在段空间是手工管理方式时, ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配, 在段空间是自动管理方式时, ORACLE是通过BITMAP来管理段内的空间分配。
1.4 ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块。
所以问题就产生了, 当用户发出一个全表扫描时, ORACLE始终必须从段一直扫描到HWM, 即使它什么也没有发现。 该任务延长了全表扫描的时间。
二、SHRINK(收缩) TABLE(表空间收缩)
从10g开始, ORACLE开始提供SHRINK的命令, 假如我们的表空间中支持自动段空间管理(ASSM), 就可以使用这个特性缩小段, 即降低HWM。 10g的这个新特性, 仅对ASSM表空间有效, 否则会报ORA-10635: Invalid segment or tablespace t