不管Oracle
有多牛,一个上千万级记录数据的表操作起来还是很慢,是超级慢.最近公司处理一个接近一亿记录数的表,需要按时间删除前几个月的数据,这个就头疼了.就是统计此表的总记录数都要处理10多分钟,更不用说根据时间条件去删除数据了.现在说说我在操作大表时遇到的问题吧.
1.删除数据非常慢
刚开始我使用的是这个sql:
delete from sun_log_access_2016 where time<to_date('2016-7-1','YYYY-MM-DD');
这就是告诉oracle
我要删除7月份之前的所有数据,oracle
在处理这个sql的时候会去遍历那一亿数据(这就会花费一大部分时间),在遍历的事就计算每条记录的time
然后判断,判断晚了之后再删除.在删除的过程中oracle
还要记录redo
日志(此日志是为了恢复删除的数据),这也需要花费大量的时间,若表中有索引,在删除的过程中oracle还要维护索引,这也会占用大量的性能.
用此sql在一亿数据中删除300万数据需要一两百分钟(可怕呀!!!)
2我修改后的删除方案
使用此sql
:
delete from sun_log_access_2016 nologging where time<to_date('2016-7-1','YYYY-MM-DD');
指定nologging
关键字,让oracle
不记录日志
删除此表的索引(删除完了之后从建索引)
用此sql在一亿数据删除300万数据只需要10多分钟(这就是效率)