说明:本文档介绍高水位线在大量删除后对全表扫描的影响,及通过ORACLE收缩的功能回收高水位线;
测试的环境:
ORACLE 版本:11.2.0.3
测试的表名:JOHN1
为了便于测试,段的管理方式为UNIFORM SIZE 1M
测试的方法:
1、创建一个表,然后插入大量的数据,记录进行全表扫描的时间;通过autotrace的方法进行测试
2、删除表中的数据,然后测试全表扫描的时间;
3、进行表的收缩工作,检查全表扫描的时间
测试:
1、创建表JOHN1,并插入大量的数据;
2、该表分配的段情况
脚本:select EXTENT_ID,BLOCKS from dba_extents where segment_name='JOHN1';
可以计算当前表占用的空间为69M(分配69个区,每个1M)
3、测试前准备工作
set timing on; 打开计时功能;
set autotrace on; 打开trace;
alter system flush shared_pool ; 清除shared_pool避免干扰
alter system flush BUFFER_CACHE ; 清除buffer_cache避免干扰
4、未删除数据前的全表扫描测试
5、删除该表的所有数据
delete from datachk.john1;
6、删除后全表扫描的测试(先清除BUFFER的数据)
虽然表已经没有数据了,但是物理读和删除之前是一样的,执行计划显示需要的时间也是一样的;
7、进行表的收缩工作;
1)打开表的行迁移
脚本: alter table datachk.john1 enable row movement ;
2)进行表的收缩,高水位的回收
脚本:alter table datachk.john1 shrink space;
8、收缩后的全表扫描测试;
通过收缩后,发现执行计划的物理读数量有了明显的下降,执行的时间也有了明显的提升;
9、再次对该表区空间的分配
总结:表的收缩工作一般都是在进行大量的数据删除之后需要进行的,但是在日常的业务中其实很少会有这样大量的删除工作,在特殊的系统和特殊的业务情景下可能会需要这样的操作。
个人工作的工作中两次的回收高水位线的操作:
1、接口的系统对象的收缩工作(曾经遇到的一个场景是原来的接口数据需要保留30天,后面由于空间的关系只保留7天,通过程序进行删除之后,发现表空间并没有释放出来,后来通过语句查找可以进行回收的对象,然后进行了shrink操作后,空间得到释放,也间接提升了效率)
2、业务系统的数据结转工作(业务系统运行3年以后,系统就会运行缓慢,很多公司采取的方法就是进行结转,然后删除2年之前的数据,如果删除完就算结束后会发现其实性能并没有明显的提升,就像我们测试的如果没有进行shrink操作,高水位线其实是没有下降的,在做一些查询工作的时候,性能也就不会有明显的提升)
............................................................................................................................................................................................................................本文作者:JOHN
ORACLE技术博客:ORACLE 猎人笔记 数据库技术群:367875324 (请备注ORACLE管理 )
...........................................................................................................................................................................................................................