大表删除部分数据

http://www.itpub.net/thread-1606484-1-1.html
看到这篇帖子,练习一下删除大表target_ test(约1亿行数据 )部分数据.即,删除target_test中,属于sys的所有对象信息
OS:Red Hat Enterprise Linux Server release 5.5 _64  虚拟机
数据库:oracle10.2.0.4.0 - 64bit
soctt用户表空间为users,只有一个数据文件,大小为20G
表的情况
SQL> show user
USER is "SCOTT"
SQL> desc target_test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                              VARCHAR2(30)
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)

SQL> select count(*) from target_test order by owner;
COUNT(*)
----------
  92037120
表的大小
analyze table test compute statistics; 
select num_rows * avg_row_len 
from user_tables 
where table_name = 'TARGET_TEST';
查出大约9G
方法1 根据ROWID分片、再利用Rowid排序、批量处理、回表删除。
declare  
   cursor mycursor is SELECT  ROWID FROM target_test WHERE  owner='SYS'  order by rowid;   
   type rowid_table_type is  table  of rowid index by pls_integer;
   v_rowid   rowid_table_type;
BEGIN
   open mycursor;
   loop
     fetch   mycursor bulk collect into v_rowid  limit 5000;   
     exit when v_rowid.count=0;
     forall i in v_rowid.first..v_rowid.last
        delete from target_test  where rowid=v_rowid(i);
     commit;
   end loop;
   close mycursor;
END;
/
中途有次undo表空间undotbs1空间满了,重建了一个undotbs02,然后设置为默认undo表空间,最后删除undotbs1.期间一直观察undotbs02空间的使用情况。
完成后,表空间使用情况如下:    
 

然后查询表的行数
SQL> select count(*) from target_test;

  COUNT(*)
----------
  46276608

方法2 根据ROWID分片、非批量处理、回表删除 
       declare
        CURSOR test2_cs(owner number,rid1 rowid,rid2 rowid) 
          IS SELECT owner from target_test
          where owner='SCOTT' and rowid between rid1 and  rid2 
          FOR UPDATE ; 
       
BEGIN
   FOR c1_rec IN test2_cs(3338,'AAAC/DAAEAAAABJAAA','AAAC/DAAEAAAABQCAA') LOOP
            delete target_test where CURRENT OF test2_cs;
   END LOOP;
END;
/

上面过程语句是参考帖子上修改的,虽然可以执行成功,但是表里的数据实际没有删除,应该是我修改的有问题(帖子里的语句还是看不太懂),以后研究!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31414383/viewspace-2132915/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31414383/viewspace-2132915/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值