我用了4,5个小时还没有结果,哪位能提高删除速度?

解决方案 »

  1.   

    建一个临时表,把不满足条件的纪录插入到临时表,TRUNCATE原表,然后把临时表中的数据倒回。对于大表,这种方法最常用。
      

  2.   

    不赞成KingSunSha(弱水三千)的做法生成一个200万条数据的临时表不见得比删除要快。而且还要倒回来,到回来还不如将临时表改名成正式表,然后重建索引和依赖的过程和函数
    用exp/imp的方法是最好的选择,先用exp  query='不满足的条件'备份。然后truncate表,然后将备份文件imp回去
      

  3.   

    drabit(square) 说的exp/imp也是一种办法,但是当query条件比较复杂的时候就不适用了。至于我说的方法,最近一直在使用。只要服务器不是太弱,在一个不带索引的表中插入几百万纪录其实是很快的,费时以分钟计。而delete的速度实在太慢,所以我基本上放弃了这种方法。
      

  4.   

    建一个临时表,把不满足条件的纪录插入到临时表,TRUNCATE原表,然后把临时表中的数据倒回。
    支持 KingSunSha(弱水三千) !!!!!!!!
      

  5.   

    quote:<<但是当query条件比较复杂的时候就不适用了>>不明白你说的条件复杂是指什么?
    query在条件涉及3个表以上时才没有办法,这种情况下,临时表可能是最好的选择
      

  6.   

    頂一下.
    总的来说最后还是用truncate.
    就看你中间过程怎么做了.
      

  7.   

    delete table where rownum<2001;
    commit;
    delete table where rownum<2001;
    commit;
    delete table where rownum<2001;
    commit;
    delete table where rownum<2001;
    commit;
    多拷贝几次.到sqlplus执行不就行了.
      

  8.   

    你试试在sql语句中加no logging,此时不记日志,无法回滚,请谨慎使用!!!!!
      

  9.   

    qoute:<<你试试在sql语句中加no logging,此时不记日志,无法回滚,请谨慎使用!!!!!>>严重错误的说法!!!
      

  10.   


    用exp/imp的方法是最好的选择,先用exp  query='不满足的条件'备份。然后truncate表,然后将备份文件imp回去drabit(square)的方法应该更好一些
      

  11.   

    KingSunSha(弱水三千) ( )的办法好,对大的表,我一般都这样干的,这是实践来的.
      

  12.   

    建一个临时表,把不满足条件的纪录插入到临时表,TRUNCATE原表,然后把临时表中的数据倒回。对于大表,这种方法最常用。呵呵,兄弟想法不错
      

  13.   

    KingSunSha(弱水三千)的方法可行。另外,提供一个办法,可以试试。在其它机器上建一个临时用的数据库;
    把要删除的表导出来,再导入临时用的数据库,在临时数据库中作以下操作:
    0. 根据delete 的条件建立合适的索引,删除其它没有用的索引和约束;
    1. 写一个过程删除若干条数据后提交;
    2. 删除完成后,删掉表的索引和约束关系;
    3. 导入原数据库;
    4. 重建索引和约束。