高水位线简单理解可以理解成放过水的木桶中留下的水痕,告诉别人它曾经有这么多水,类比到数据库,某a表曾经存放0数据,那高水位线就在0这里,如果存放10000,那高水位线就在10000这,如果delete(truncate不会保留高水位线)了后,那高水位线还是在10000这,代表曾经到达的最高位。全表扫描会一直扫到高水位线,即使里面全是空的,所以会延长全表扫描的时间。
1.定性的方法,数据块多、行数少,表的块数量与表大小比对,必定存在高水位线
select owner,tablespace_name,TABLE_NAME,BLOCKS,NUM_ROWS*AVG_ROW_LEN/1024/1024 “m”,NUM_ROWS,EMPTY_BLOCKS,AVG_SPACE_FREELIST_BLOCKS,AVG_ROW_LEN,NUM_FREELIST_BLOCKS from dba_tables where TABLE_NAME=‘LIS_INSPECTION_RESULT’;
2.存储过程判断
网上有很多可以搜索。
3.查找数据库中某个表空间下,可以实际存储和需要的表空间差别最大的前10张表
从统计信息的出平均每行的长度和总行数,AVG_ROW_LENNUM_ROWS/1024/1024/0.9=判断的存储size(AVG_ROW_LENNUM_ROWS),建议收集统计信息后查比较准确,90%的使用率,所以算大小再/0.9。Dba_tables中的AVG_ROW_LEN以字节(b)为单位,BLOCKS*8/1024=块数x每个块8k/1024
语句(替换表)
SELECT NUM_ROWS,AVG_ROW_LENNUM_ROWS/1024/1024/0.9 NEED, BLOCKS8/1024 TRUE,(BLOCKS8/1024-AVG_ROW_LENNUM_ROWS/1024/1024/0.9) RECOVER_MB,TABLE_NAME FROM dba_tables WHERE TABLESPACE_NAME=‘BB’ AND BLOCKS8/1024-AVG_ROW_LENNUM_ROWS/1024/1024/0.9>100 AND rownum<11 order by RECOVER_MB desc;
不准确的可能性:
1.统计信息未收集,dba_tables视图里记录的不是最新的数据。
2.可能lob字段的原因,lob的信息不记录在dba_tables里。
1.重建表(不建议使用,整个表会锁住,且索引需要重建)
alter table table_name move;
Rebuild index
收集统计信息
2.shrink(收缩表)(建议使用)
时间较短,过程中部影响使用,开始和结束的时候会有锁,建议晚上业务低峰期操作
shink表空间必须为ASSM管理
select TABLESPACE_NAME,BLOCK_SIZE,SEGMENT_SPACE_MANAGEMENT,ALLOCATION_TYPE from dba_tablespaces;
Auto为是assm管理
需要先开启行迁移
alter table TEST_TAB enable row movement;
再收缩
alter table table_name shrink space;
关闭
alter table test_stud1 disable row movement;
1.对表的shrink space并不会导致其上的索引一并收缩空间。
2.SHRINK SPACE不支持对存在函数索引的表的操作。
3.SHRINK SPACE COMPACT只对目标对象做空间碎片整理,但并不调整高水位标志,也不会回收空间。但SHRINK SPACE则还会调整高水位标志,并回收空间。
假如 要同时压缩表的索引:ALTER TABLE TEST_TAB SHRINK SPACE CASCADE
3.expdp/impdp
导入导出一遍
4.复制到另个表,换名字
复制要保存 的数据到临时表t,drop原表,然后rename临时表t为原表
5.Alter table table_name deallocate unused
注:这证明,DEALLOCATE UNUSED为释放HWM上面的未运用 空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
6.在线重定义
略
7.truncate(不现实)
等等方法