ORACLE表段中的高水位线

        在ORACLE数据的存储中,可以把存储空间想象为一个水库,插入数据,高水位线就会上涨,但是用delete语句,数据虽然删除了,但是高水位线没有降低,也就是说高水位线在增删操作中只会上涨不会下跌,。HWM通常增长的幅度为一次5个数据块。

         例如:表中有一千万条数据,这时高水位线就在一千万条数据这里,后来删除一千万条数据,这次扫描和扫描一千万条数据所需要的时间是一样多的,原因是,ORACLE扫描是按照高水位线来的,所以要把一千万条数据的存储空间都要扫描一次。所以有时候有人总是经常说,表中没几条数据,为什么这么慢,这就是高水位线的原因


使用truncate可以清除高水位线

1.DELETE
 DML语言
 可以回退
 可以有条件的删除,需要扫描数据块

2.TRUNCATE TABLE
 DDL语言(数据定义语言,不需要提交)
 无法回退
 默认所有的表内容都删除
 删除速度比delete快。
相当于drop表再新建表

================================================


1 HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移.

这就好比是水库的水位,当涨水时,水位往上移,当水退出后,最高水位的痕迹还是清淅可见.

ORACLE 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM),

2. HWM的信息存储在段头当中.

HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.

3 ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块.

所以问题就产生了.当用户发出一个全表扫描时,ORACLE 始终必须从段一直扫描到 HWM,即使它什么也没有发现。该任务延长了全表扫描的时间。

4 当用直接路径插入行时,即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。

例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 数据块直接置于 HWM 之上。它下面的空间就浪费掉了。

=================================

 insert /*+append*/ into table1 select * from table2


在使用了append选项以后,insert数据会直接加到HWM以上的数据块,不扫描HWM以下的数据块,而不会在表的空闲块中插入数据。
使用append减少对空间的搜索,会增加数据插入的速度。一般用于大数据量的处理

建议不要经常使用append,这样表空间会一直在高水位上,除非你这个表只插不删