一,高水位线定义
高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式。高水位线对全表扫描方式有着至关重要的影响。当使用delete 操作
表记录时,高水位线并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。下图给出高水位线的描述,如何降低高水位线,以及高水位线对全表扫描的影响。
二、实例演示
创建表t1_bak
收集t1_bak表 统计信息
exec dbms_stats.gather_table_stats('SYS','T1_BAK');
查看t1_bak 表块信息
插入数据
收集统计信息 可以看出数据块数目已经变成了172
查看执行计划
select count(1) from t1_bak 有 186个逻辑读取
删除数据,删除数据后表中只剩下900条数据
重新收集统计信息发现,t1_bak表还是 有172个块
再看执行计划
逻辑读有 180个,比 删除数据前只少了6个
修改高水位线
alter table t1_bak move //并不会影响CF(聚簇因子)的值,该功能只是移动高水位线,且不释放空间
方法二: 如果表空间是local的 无法执行
--alter table table_name enable row movement; alter table table_name shrink space;
--压缩块后所有索引都会失效,需要重建一下索引 ,本例没有创建索引
ALTER INDEX INDEX_NAME REBUILD;
改完后再看数据块 数据块已经为14个;
-- 扩展查看实际使用的块
SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) USED_BLOCK
FROM t1_bak
执行计划 逻辑读减为21个,且成本变为了6
总结: 对于频繁加载和清除的表(使用delete而不是truncate),由于受到高水位线的影响,表的响应时间会越来越慢,所以尽量选择truncate。truncate不影响高水位线。