我现在的问题是有一个大的事实表,已经有数十亿条数据,过来的临时表需要merge进去. 临时表的大小也不确定,可能上十亿也可能只有几百几千万而已.
如果直接让这两个表merge起来,则需要很大的内存来进行处理.所以我就想着把数据进行按时间拆分的处理,然后merge进去,
拆分的条件是如果临时表的数据量大于三亿条,我就按二亿条左右一个批次进行merge.
总体设计完的package是这样的:
1.第一步,获取总的行数,然后分支下去进行判断.d大于三亿则拆分,否则只执行一次.
2.第二步,获取拆分的数据信息,生成开始时间与结束时间列表.因为我访问的数据库是vertica,语法与tsql略有差异.
我的示例vsql如下:
select
min(yearmonthday)::varchar as startdate,
timestampadd(day,1,max(yearmonthday))::varchar as enddate
FROM
(
select
sum(count(*)) over(order by run_strt_ts::timestamp::char(10)) as totalcount,
floor(sum(count(*)) over(order by run_strt_ts::timestamp::char(10))/200000000) as lvl,
run_strt_ts::timestamp::char(10)::timestamp as yearmonthday
from schemaname.tablename
group by run_strt_ts::timestamp::char(10)
) AS A
group by lvl order by lvl
生成类似的结果集:
这一步我使用了一个Execute sql task对象,配置为返回Full Result Set,传递一个object类型的变量接收.
刚开始我的设计不是这样的,我使用dataflowtask,然后里面一个ado.net source 去获取数据,传递给一个记录集destination.但总是报如下的异常:
所以我就改用现在的设计.
3.第三步就是使用一个Foreach look container,传递两个变量去接收返回的startdate与enddate.
接着就简单了,装配tsql,传递 给一个Execute sql task 任务.