20亿条数据的单表,如何快速、准确的逐条处理?

问题描述

现有ORACLE数据库里的A表,数据量20亿,无修改权限,主要字段有:

  • 省份ID
  • 物资类型
  • 更新日期
  • 其他字段若干

现在需要数据移植到新数据库的B表,B表数据模型与A表差异巨大,需要A表数据进行复杂计算处理才能入B表。

计划开发移植程序,基于JAVA技术栈。
每次移植都按照省份ID和物资类型进行移植。
单省份+单物资类型数据量从10w到2000w不等。

各位大佬,怎样才能较快速的完成移植?(单省份+单物资类型在6个小时内处理完毕)

补充1:JDBC流式读取应该可以解决数据量太大OOM的问题。
但是还有个问题,一旦处理过程异常,比如线程挂了,甚至进程挂了。怎么能做到断点续处理:)

阅读 2.3k
3 个回答

问题:是否需要考虑线上迁移还是离线迁移,就是迁移的过程中需要考虑线上业务吗?

如果不考虑线上业务,可以考虑多线程处理:
1.先统计m个省份,n个物资类型
2.如果n>m,则可以考虑循环n次,每个循环中间开启m个线程.就是每个线程处理单省份+单物资类型.
3.单个线程内部,每次读取省份+物资类型过滤数据,单次读取500条(数据条数可以调整).循环处理这一批数据,然后批量写入B表. 如果可以,可以考虑把b表的索引全部去掉,提升b表的写入速度.如果遇到异常数据,需要记录下数据的ID,最后对异常数据做统一处理
4.迁移完成之后再给b表添加索引.

其中步骤3可以添加机器,比如说5台机器,每台机器处理固定的省份,处理完之后下掉机器就行了.

处理方案的瓶颈在于对A表数据进行复杂计算的效率(1秒1条还是1秒100条),如果效率跟的上,整体效率应该可以满足迁移要求(平均 单省份+单物资类型的处理时间小于6小时).

如果可以通过备份A表到A1,然后拥有A1的修改权限,可以考虑sql搞定迁移.

用dataX编写插件应该可以解决

为什么要用java处理这个,这个明显用数据库工具+plSql来完成。

推荐问题
宣传栏