最近发现一个运行了近五年的oracle数据库响应速度越来越慢,一开始怀疑是程序的问题,对一些程序优化过后,并没有明显改善,网上查询相关资料,了解到oracle表空间如果存在大量碎片,也会导致oracle效率降低,通过以下脚本查询得到碎片fsfi 值
select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
group by tablespace_name order by 1;
查询结果如下:1 EXAMPLE 71.3741345382551
2 SYSAUX 26.1954852034411
3 SYSTEM 100
4 UNDOTBS1 52.5921732984285
5 USERS 11.1630233997361
发现users表空间的fsfi值为11,网上说低于30就会拖慢系统响应速度。因此着手开始进行碎片整理,oracle11g虽然支持在线重构,但由于没有实践经验,也不知道重构需要多长时间,因此尝试了将应用停止,先通过命令exp导出dmp文件,drop user XX cascade后,再新建用户,最后imp再导入。
导入完成后,再次通过上述的脚本查询,发现users表空间的fsfi值为54,说明导出再导入还是起到了碎片整理的作用,再打开应用,发现速度上也提高了不少。