`
lirig
  • 浏览: 235385 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle 中批量删除数据

阅读更多

因为数据中存在大量垃圾数据,但是不能全部删除,整个表一共有20亿多,要删除10多个亿的数据。如果一次删除肯定没有希望。又不能删除表,最后搞了半天脚本如下:

 

declare

 

begin

 

for i in 1..10000000 loop

 

delete /*+ index(a,idex_id )*/from table where id>1000000000 and rownum<100;

 

commit;

end loop;

 

end;

 

 

执行后去干其他事情就可以了

 

其实还有很多种方法,大家各抒己见吧

 

2
0
分享到:
评论
1 楼 stormhzy 2011-03-14  
   加HINT提示符强制CBO走索引是一个思路,那用在DELETE语句显得不太合适。
    既然整个表一共有20亿多,要删除10多个亿的数据,为何不采用CTAS的变通办法还实现数据删除呢?

    具体思路如下:
    1. 将原表rename
    ALTER TABLE table rename to table_tmp;

   2.CTAS

   CREATE TABLE table
   tablespace tablespace_name
   NOLOGGING
   parallel 4
   AS
   SELECT * FROM table_temp WHERE  id <= 1000000000;

   这样通过NOLOGGING、parallel并行的办法,大大减少了直接DELETE产生的REDO,提 升了速度。当然,还可以采用INSERT /*+APPEND*/,或直接路径导入等策略都可以。
  
   3.如果原来表有触发器和约束,则需要重建
   
   4.创建索引
  
   5.删除临时表   drop table table_emp purge;

这样通过将删除转化为插入的方式,提升了删除的性能。
  
  

相关推荐

Global site tag (gtag.js) - Google Analytics