写了一个小程序,有条件的删除oracle 8.17数据库里某个表里的数据
7年了 现在 那个表的总数据量大概有1.5亿条
最近想删除一些老的数据,所以写了个小程序挂在服务器上慢慢删数据
我是每删1000条数据就提交一下,刚开始几小时删的速度还挺快的
但是现在速度越来越慢,感觉无法接受的样子了,
目前删除1000条数据大概要6秒
之前1秒都不用的
高手请教,这是什么原因
------解决方案--------------------
可以将索引重建或重组试下,看看是否有改善
1、Drop原来的索引再重建这些索引,这种方法的优点是索引彻底重建,达到最理想的状况。但是这此会阻塞所有的查询,最好是在索引碎片十分严重,并且使用REBUILD无法达到效果的情况下使用。注意:使用DROP_EXISTING子句,可以避免non-clustered index被重建两次。
2、ALTER INDEX 索引名 REBUILD 重新生成索引。
重新生成索引将会删除并重新创建索引。这将根据指定的或现有的填充因子设置压缩页来删除碎片、回收磁盘空间,然后对连续页中的索引行重新排序。该方法在一个事务中完成操作,在数据文件中需要有足够的free space来满足将所有的索引及相关的一些对象进行重建,否则操作可能失败,或者是重建的不十分彻底。对于数据量非常大的表,所需的free space也更多,应当特别注意这一点。
3、ALTER INDEX 索引名 REORGANIZE 重组索引。
使用最少系统资源重新组织索引,重新组织还会压缩索引页。可以在数据库online的情况下执行,但是整理不够彻底。
------解决方案--------------------
高水位问题
现在的删除应该走的是全表扫描。如果利用索引来找这1000条,会快得多
其实我觉得还不如将要保留的数据导出,然后重建这个表,把水位降下来