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/,如需转载,请注明出处,否则将追究法律责任。