Oracle中大資料量刪除

舊夢依稀發表於2013-06-28

  因為遷移需要,需要清理生產庫中 累積的大量歷史資料,根據待清理的資料性質,整理出以下兩種方案:

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章