历史表
t1 {a, start_dt, b, end_dt, create_time}
当前表
t {a, b}
其中a是主键
1.当 t 中的 a 在t1不存在时,往t1 新增一条记录{a, sysdate, b, 30001231, sysdate}
2.当t中的a, b 在t1 中的a,b是一样的,则什么都不做
3.当t中的a在t1存在,但是b不一样,则新增步骤1的数据,同时更新t1 中的a记录的结束时间由30001231改成当前时间
我目前的做法是使用存储过程用 t 的a,b 去 minus t1 找出不同a,b记录的数据
然后循环每条记录,判断如果是新记录就往历史插入一条,否则做判断更新和历史关链操作
问题:存储过程运行速度太慢,如果有500万条记录,每条记录去执行一次,并做比较速度很慢,加上索引还是不行
请问我这个逻辑能实现批量处理?或者有没有其他优化方法达到历史数据处理的目的?
谢谢!
------解决思路----------------------
存储过程实现:
--找到相对于t1表发生变化的t表数据(包括新增数据和a字段相等b字段变化数据)放入临时表中存放
1、insert into t_temp(a,b,start_dt,end_dt)
select t.a,t.b,sysdate,30001231 from t left join t1 on t.a = t1.a where t.b <> t1.b or t1.b is null;
--更新t1表中存在于临时表中的数据(存在于临时表中则为a字段相等b字段变化的数据)
2、update t1 set t1.end_dt = sysdate where exists (select 1 from t_temp tm where tm.a = t1.a );
--将临时表中的数据新增到历史表中
3、insert into t1(a,b,start_dt,end_dt,create_time) select a,b,start_dt,end_dt,sysdate from t_temp;
典型的拉链表