我把oracle的表名为:ABC_LOG_SEND 的数据备份了出来,
备份的文件竟有15.2G 
现在我想把表中2007年的数据按月份删除,从早上到现在第一个月的数据还没有删除完呢。
我的语句是:
delete from abc_log_send s
where  s.create_time >= to_date(20070101,'yyyymmdd')
and s.create_time < to_date(20070201,'yyyymmdd')
请教各位有没有快速删除的语句呀。。
我google了,也没有找到答案。。
在线急等

解决方案 »

  1.   

    1.删除的时候不写日志,这样可能快点2. 创建临时表把2008年的数据导出来, 然后truncate table,然后再把2008年的数据冲临时表转会来
      

  2.   

    chliang315你好,你说的第二步问题是,虽然truncate很快,但导数据是不是也会花费很多时间,
    我觉的还是做一个job,让机器自己去处理吧。
      

  3.   

    delete   from   abc_log_send   s 
    where     s.create_time   > =   to_date(20070101,'yyyymmdd') 
    and   s.create_time   <   to_date(20070201,'yyyymmdd') --------------->>>>>>>>>>>
    where里日期的比对好像to_char比to_date快,
    试下下面的:
    delete  from  abc_log_send  s 
    where  to_char(s.create_time,'mm') ='01' --删除1月份的资料
      

  4.   

    to_char比to_date快?这个不清楚,但是我知道比较符里面 = 要比 > 或者 < 快很多。
      

  5.   

    补充一下,像你这样数据量比较大的情况下,=   要比   >   或者   <   快很多。
      

  6.   

    谢谢各位呀。。
    那我备份出来的文件是 *.dmp 请问如何刻盘呀?
     现在讨论继续。。呵呵
      

  7.   

    create_time 有索引吗? 如果没有建立索引这样会快些的 还有再加上2楼的方法 相信会快不少的
      

  8.   

    s.create_time 到底是什么类型和值,比如s.create_time是VARCHAR2(8),存的比如是20080101这类的数据,就
    直接建个索引,然后   s.create_time       >   =      '20070101' 
    and       s.create_time       <    '20070201'
    就好了
      

  9.   

    建立分区表吧,这样你以后维护都会方便很多的。
    这么大的数据可以考虑先通过建立新的表的方式,直接把有用的数据导入到新表中,
    把老的表drop掉就行了。
      

  10.   

    谢谢这么多热心人呀,回答12楼:create_time是date 型的
      

  11.   

    sql里面用了函数,你不如用“sysdate-天数“试试
      

  12.   

    个人觉得最好还是用exp导出有用的数据然后把表删了从建,导出的时候选compress位y,这样还可以优化一下表