优化处理亿级数据的效率

背景:某个外围系统提供一个业务视图,数据量大概1.3亿左右,数据库是oracle。

目标:把这1.3亿的数据筛选、去重根据业务类型保存到目标数据库PG。

项目原有取数逻辑:两个定时任务,任务A定时到指定的数据源查询数据,并且缓存到redis;任务B实时监控redis是否有数据,如果有数据就根据业务逻辑逐条处理。注:由于用到drools脚本规则,逐条处理的过程每次都需要编译、执行drools脚本非常耗时。

 

1、按既有的项目取数逻辑开发,任务A查询整个1.3亿的数据都需要接近24小时缓存到redis,任务B逐条读取redis缓存数据到目标库PG也要接近24小时。原有的机制,谁都受不了。接下来就开始优化过程,记录整个逻辑。

2、由于外围系统只提供一个视图,数据量太大,一条sql查询效率肯定非常低。(耗时估计24hour,撞墙)

3、把视图按业务类型拆分成了16个视图,对应每个视图启动16个线程进行查询。

4、使用的是mybatis分页查询,数据量还是非常大,由于是oracle的分页查询,每次执行都需要花费60s。(耗时估计4hour,无法忍受)

5、从视图入手,压缩数据量,根据业务需要去重,把条件过滤放到java代码里处理。sql只做查询。

6、分页效率也非常低,且页面不需要分页展示,故把mybatis分页查询改成有jdbc的result.next读取数据,效率由原来的4小时左右优化到了20分钟,这时候查询oracle,并且去重缓存到redis的数据量大概6000W左右。(查询耗时20min)

你可能感兴趣的:(优化处理亿级数据的效率)