db2 "create table test(id int,name varchar(10)) partition by range(id) (part1 starting 1,part2 starting 2,part3 starting 3)"
id=1的分区中存在1000W条记录,id=2的分区中存在5000W条记录,id=3的分区中存在1亿条记录
现在想把id=2的分区数据从当前库归档到历史库,归档完之后id=2的分区必须还存在,因为过几天这个分区又有新的几千万条数据进来,有如下两种方案:
方案一:
alter table test detach part2 into table t2;
alter table test attach part2 starting 2;
declar c2 cursor for select * from t2;
load from c2 of cursor insert into table test_his;
drop table t2;
reorg table test;
方案二:
declar c2 cursor for select * from test where id=2;
load from c2 of cursor insert into table test_his;
--类似如下进行分页删除,每10W条删除一次
delete from (select ROW_NUMBER() OVER(order by id,name) as rownum from test) t where t.ROWNUM>=1 and t.ROWNUM<=100000
第一种方案,如果不需要执行reorg的话会很快,但因为执行了多次alter,为了不影响后续表的插入等操作,只有进行reorg了。
第二种方案,保守但可靠,只是执行时间长一点,目前采用的是第二种方案。
后续想法是,在UAT环境进行第一种方案的测试,如果表分区的detach和attach不需要对表进行reorg的话,就改为第一种方案。
如果第一种方案不需要reorg表也可以直接做,请各位大拿给出肯定答复,不胜感激。