先看看select语句的执行计划确认是查询的慢还是插入操作慢,还有索引是如何建立的?
另外
extime>=to_date('2014-11-01' , 'yyyy-mm-dd') and extime<to_date('2014-12-01' , 'yyyy-mm-dd')
可以一次性把11月所有数据都检索出来,并且这么写是可以走extime字段的索引的

解决方案 »

  1.   

    另外可以考虑使用批量处理,百度下 bulk into的用法
      

  2.   


    其实没有什么执行计划。本来应该是实时的把数据放到月表里, 因为一个月来这个程序没正确运行,所以累计了1300w。exlistcash  只有extime一个索引。
      

  3.   

    exlist表1300w数据,要移出去1000w数据,即移出去了大部分数据。
    是不是可以采用移出去小部分数据的方法大致思路如下:
    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
      

  4.   

    设计问题,两张大表要进行比对,却没有可以用来标识的唯一键。
    最好是能在两个表中都补上这么一个字段,按照主键来比对就好了或者,其实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;
      

  5.   

    正常情况下月表会慢慢增加的,大约能增加到1千万。
    exlistcash 表时边增加边减少。
    由于之前减少的功能出问题了,导致11月份的都没有移过去,才有的现在这个问题