ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle中大数据量删除

Oracle中大数据量删除

原创 Linux操作系统 作者:旧梦依稀 时间:2013-06-28 16:03:42 0 删除 编辑

  因为迁移需要,需要清理生产库中 累积的大量历史数据,根据待清理的数据性质,整理出以下两种方案:

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

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2013-06-24

  • 博文量
    46
  • 访问量
    166789