oracle中高水位是指:
在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

建测试表:
CREATE TABLE TEST_TAB(C1 NUMBER(10),C2 CHAR(100))  ; 

插入100万测试数据:
DECLARE
I NUMBER(10);BEGIN
FOR I IN 1..1000000 LOOP
INSERT INTO TEST_TAB VALUES(I,'TESTSTRING');
END LOOP;
COMMIT;END ; 

分析表:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'MCHIS',
TABNAME=> 'TEST_TAB',
PARTNAME=> NULL);
END;

查看表信息
select * from DBA_TAB_STATISTICS  WHERE TABLE_NAME='TEST_TAB'
表'TEST_TAB' 100万行 占用了 15449个BLOCK

查询高水位位置:
注意MABESIZEG是指大概占用的空间,平均长度*记录数/(1-PTCFREE)
SELECT  ROUND(A.NUM_ROWS * A.AVG_ROW_LEN/1024/1024,3)/0.9  MABESIZEG,
        ROUND(A.BLOCKS *8/1024,3) SIZEG
  FROM  DBA_TABLES A
WHERE  TABLE_NAME='TEST_TAB'
MABESIZEG             SIZEG
110.945                     120.695

打开AUTO TRACE,查询 TEST_TAB :
SELECT COUNT(*) FROM TEST_TAB;
花费2s  有15450 个物理读

删除90W数据
delete from TEST_TAB where c1>10000;

再次分析表
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'MCHIS',
TABNAME=> 'TEST_TAB',
PARTNAME=> NULL);
END;

查询高水位位置:
SELECT  ROUND(A.NUM_ROWS * A.AVG_ROW_LEN/1024/1024,3)/0.9  MABESIZEG,
        ROUND(A.BLOCKS *8/1024,3) SIZEG
  FROM  DBA_TABLES A
WHERE  TABLE_NAME='TEST_TAB'
MABESIZEG             SIZEG
1.102                       120.695

清空缓存:
ALTER  SYSTEM  FLUSH  BUFFER_CACHE;

查询数据:
SELECT COUNT(*) FROM TEST_TAB;
花费1s   同样有15450 个物理读

打开row movement:
alter table TEST_TAB enable row movement; 

清除高水位空间:
alter table TEST_TAB shrink space cascade;

分析表,检查空间:
select * from DBA_TAB_STATISTICS  WHERE TABLE_NAME='TEST_TAB'
表'TEST_TAB' 1万行 占用了 152个BLOCK

再次查询
SELECT COUNT(*) FROM TEST_TAB; 
花费103ms   有153个物理读