1亿条以上数据,备份历史表,并且删除正表数据方案

背景:
   将正表的数据备份到历史表里,且删除正表的数据

方案
   1 先将要备份的数据的主键全部放到一张临时表,且将临时表加索引
   2 从临时表去查找正表数据,然后备份该条数据到历史表里,然后删除正表数据
     在删除临时表数据(在查找临时表的时候,可以使用mod函数将该字段取余,起多个线程去做,
     可以实现数据不重复处理问题).

解决方案实现
   1:创建临时表
     create tabel task_chl_statuscd1100107 as select contact_task_chl_id from task_chl
   2: 为临时表创建索引
   3:创建存储过程(该存储过程可以替换为代码实现),作者循环调用存储过程
    create or replace procedure toTaskChl(i_size in number) is

  v_insertSql varchar2(500);
  v_tableDate varchar2(500);

begin
    --这里使用了mod函数的方式取数,然后代码调用该存储过程的时候,可以多线程,传不通的值
    -- 就不会出现取到重复的数据
  for r in (select *
              from task_chl_statuscd1100107
             where mod(contact_task_chl_id, 1) = i_size
               and rownum < 5001) loop
  
    select to_char(a.create_Date, 'yyyyMM')
      into v_tableDate
      from contact_task_chl a
     where a.contact_task_chl_id = r.contact_task_chl_id;
  
    v_insertSql := 'insert into contact_task_chl_' || v_tableDate ||
                   ' select * from contact_task_chl where contact_task_chl_id = ' ||
                   r.contact_task_chl_id;
    EXECUTE IMMEDIATE v_insertSql;
    delete from contact_task_chl
     where contact_task_chl_id = r.contact_task_chl_id;
    delete from task_chl_statuscd1100107
     where contact_task_chl_id = r.contact_task_chl_id;
  end loop;
  --dbms_output.put_line(v_insertSql);
  commit;
end toTaskChl;


     

 

你可能感兴趣的:(oracle,java,存储过程)