因为迁移需要,需要清理生产库中 累积的大量历史数据,根据待清理的数据性质,整理出以下两种方案:
1、需删除表中全部数据的,对表执行TRUNCATE操作(速度很快)。
TRUNCATE TABLE tab_p_mt_resp;
2、对于需有条件删除数据的表,按照是否分区表分别采取以下两种操作:
a)对于分区表,定位存放有过期数据的分区,采用删除分区的方式删除其中的数据(速度也很快,重建索引一般也不会太慢)。
ALTER TABLE tab_p_mt_log DROP PARTITION P201208;
如果分区上建有全局索引(GLOBAL INDEX),DROP分区会造成索引失效,则需要在DROP完分区后重建索引。
ALTER INDEX IDX_MTLOG_MOBILE REBUILD;
(LOCAL INDEX在DROP分区后不会失效,所以不用REBUILD)
b)对于非分区表,我们采取分批删除,分批提交的办法,避免造成ORA-01555错误,下面是采用自治事务删除过程(相对上面两种方法是最慢的,但有时我们别无选择):
create or replace procedure delBigTab
(
p_TableName in varchar2,
p_Condition in varchar2,
p_Count in varchar2
)
as
pragma autonomous_transaction;
n_delete number:=0;
begin
while 1=1 loop
EXECUTE IMMEDIATE
'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
USING p_Count;
if SQL%NOTFOUND then
exit;
else
n_delete:=n_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
commit;
DBMS_OUTPUT.PUT_LINE('Finished!');
DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
end;
/
exec delBigTab('TAB_P_RPT_1069','MT_TIME
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28998293/viewspace-765067/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28998293/viewspace-765067/