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个物理读