oracle高水位线处理

来源:这里教程网 时间:2026-03-03 19:08:27 作者:

简单概念:

高水位线简单理解可以理解成放过水的木桶中留下的水痕,告诉别人它曾经有这么多水,类比到数据库, 某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_LEN*NUM_ROWS/1024/1024/0.9=判断的存储size(AVG_ROW_LEN*NUM_ROWS), 建议收集统计信息后查比较准确,90%的使用率,所以算大小再/0.9。Dba_tables中的AVG_ROW_LEN 以字节(b)为单位 BLOCKS*8/1024=块数x每个块8k/1024 语句(替换表)

SELECT NUM_ROWS,AVG_ROW_LEN*NUM_ROWS/1024/1024/0.9 NEED, BLOCKS*8/1024 TRUE,(BLOCKS*8/1024-AVG_ROW_LEN*
NUM_ROWS/1024/1024/0.9) RECOVER_MB,TABLE_NAME FROM dba_tables WHERE TABLESPACE_NAME='BB' AND BLOCKS*8/
1024-AVG_ROW_LEN*NUM_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(不现实) 8.等等方法

相关推荐