数据量数以千万计时,初次一次性抽取历史数据容易出现卡死,针对这种情况可以使用循环年份抽取,并且加入增量程序使得后续抽取增量化!
整体流程:

1、获取年份极值(获取历史有数据的年份最大最小值)

获取日期:
select min(to_char(jyrq,'yyyy')) || '~' || max(to_char(jyrq,'yyyy')) YearRange from veh_is_warning where to_char(jyrq,'yyyy')>=?
2、获取时间范围(通过切分获得历史年份最大最小值)
var prevRow=previous_result.getRows();
var listv=previous_result.getRows().toString().split("~");//切分为数组
if (prevRow == null && (prevRow.size()==0))
{
false;
}else{
parent_job.setVariable("startTime",listv[0].substr(2,4));//最小年份
parent_job.setVariable("endTime", listv[1].substr(0,4));//最大年份
true;
}
3、检测字段值(从最小年份开始循环抽取数据)

4、获取目标表上次同步最大时间(设置目标库上次同步完的最大时间)


上次同步最大月份:
select nvl(to_char(max(tjrq),'yyyymmdd'),'19700101') maxUpdateRq from MON_FACT_UNUSUAL_WARN where tjrq<=trunc(sysdate-1)
5、检验异常预警情况统计(数据条件控制)


数据来源veh_is_warning:
select sum(1) yjs
,t.jyrq tjrq,nvl(t.jcxdh,'NA') jcxdh,nvl(t.jyjgbh,'NA') jyjgbh,
nvl(t.glbm,'NA') glbm,nvl(t.fzjg,'NA') fzjg,
nvl(t.yjlx,'NA') yjlx,
--t.hpzl,t.hphm,d.hphm,
nvl(d.cllx,'NA') cllx
from veh_is_warning t
left join vehicle d on t.hphm=d.hphm
where t.yjzt=1
and to_char(t.jyrq,'yyyy')='${startTime}'
and to_char(t.jyrq,'yyyymmdd')>='${P_MAXUPDATERQ}'
group by
t.jyrq,t.jcxdh,t.jyjgbh,t.glbm,t.fzjg,
t.yjlx,
--t.hpzl,t.hphm,d.hphm,
d.cllx
6、控制循环次数
var size = new Number(parent_job.getVariable("endTime"));
var i = new Number(parent_job.getVariable("startTime"))+1;
if(i<=size){
parent_job.setVariable("startTime", i);
}else
{
parent_job.setVariable("startTime", 1);//控制退出
parent_job.setVariable("endTime", 0);//控制退出
}
true;
本文介绍了一种针对千万级数据量的历史数据抽取方法,通过循环年份抽取与增量程序结合的方式,有效避免了数据抽取过程中的卡死现象。具体步骤包括获取年份极值、时间范围、检测字段值等。

1873

被折叠的 条评论
为什么被折叠?



