由于某种错误导致数据表数据巨大(千万级别),删除后对该数据操作速度极慢的原因及解决方法
2016-01-18 17:14
681 查看
有时,可能由于不经意的错误操作导致数据表数据极大,然后你就会试着将这部分数据删除或者直接delete整个表,进行恢复。但你会发现,即使后恢复后数据量和错误之前一样,但是操作起来(如count
(*))速度确是极慢,可能简单查询要四,五分钟!这是为啥呢?
本人就碰到过这样的情况。有一次在存储过程中死循环插入数据导致一个表有大量数据,有三千万,删除这些垃圾数据后,后再去操作这个表,速度就很慢很慢的。再对这个表操作(插入,查询)就好慢,select count(*)都要好5分钟。在此与大家分享。
这种问题是高水位线(HVM)导致的,错误的插入了很多数据,导致表数据块变多,高水位线变高,虽然你数据删了,但每次查询和删除需要扫描的块还是你误插入那么多。解决办法就是降低水位线。
有两种方法:
1,把表数据 备份一下, 然后把表truncate。注意是truncate而不是delete!
恢复即可。注意索引。
2,第二个也是推荐方法,不过仅适用于10g之后
---回收HWM(将多余的块、碎片整理、回收,降低HVM)
alter table &table shrink space;
若果数据库某些设置没设置好,如:row moving is notenable等就会报错。应先设置。
闲麻烦就直接用第一种即可。第二种是本质方法。
(*))速度确是极慢,可能简单查询要四,五分钟!这是为啥呢?
本人就碰到过这样的情况。有一次在存储过程中死循环插入数据导致一个表有大量数据,有三千万,删除这些垃圾数据后,后再去操作这个表,速度就很慢很慢的。再对这个表操作(插入,查询)就好慢,select count(*)都要好5分钟。在此与大家分享。
这种问题是高水位线(HVM)导致的,错误的插入了很多数据,导致表数据块变多,高水位线变高,虽然你数据删了,但每次查询和删除需要扫描的块还是你误插入那么多。解决办法就是降低水位线。
有两种方法:
1,把表数据 备份一下, 然后把表truncate。注意是truncate而不是delete!
恢复即可。注意索引。
2,第二个也是推荐方法,不过仅适用于10g之后
---回收HWM(将多余的块、碎片整理、回收,降低HVM)
alter table &table shrink space;
若果数据库某些设置没设置好,如:row moving is notenable等就会报错。应先设置。
闲麻烦就直接用第一种即可。第二种是本质方法。
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解