先看看select语句的执行计划确认是查询的慢还是插入操作慢,还有索引是如何建立的?
另外
extime>=to_date('2014-11-01' , 'yyyy-mm-dd') and extime<to_date('2014-12-01' , 'yyyy-mm-dd')
可以一次性把11月所有数据都检索出来,并且这么写是可以走extime字段的索引的
另外
extime>=to_date('2014-11-01' , 'yyyy-mm-dd') and extime<to_date('2014-12-01' , 'yyyy-mm-dd')
可以一次性把11月所有数据都检索出来,并且这么写是可以走extime字段的索引的
其实没有什么执行计划。本来应该是实时的把数据放到月表里, 因为一个月来这个程序没正确运行,所以累计了1300w。exlistcash 只有extime一个索引。
是不是可以采用移出去小部分数据的方法大致思路如下:
1.新建表与exlist表结构一致,例如为exlist_tmp
2.将不需要移除的300w数据插入到exlist_tmp表中insert /*+ append*/ into exlist_tmp
为extime字段建索引,extime<to_date('2014-11-01' , 'yyyy-mm-dd') or extime>=to_date('2014-12-01' , 'yyyy-mm-dd')
3.删除exlist表中移除的300w数据
4.rename exlist to exlistcash201411
5.rename exlist_tmp to exlist
最好是能在两个表中都补上这么一个字段,按照主键来比对就好了或者,其实exists条件可以不要。因为,一开始的时候,两张表是没有重叠数据的,后续在14年11月1日这样的日期里也不会有新的数据加入
那么,只要11月1日的数据Insert成功,在另一个表直接delete这天的数据就行,不用担心会部分成功部分失败。
日期条件要改下变成insert into exlistcash201411
select *
from exlistcash
where transflag = 1
and extime >= to_date('2014-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
and extime <
to_date('2014-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') + 1;
delete from EXLISTCASH
where and extime >= to_date('2014-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and
extime < to_date('2014-11-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') + 1;
exlistcash 表时边增加边减少。
由于之前减少的功能出问题了,导致11月份的都没有移过去,才有的现在这个问题