论坛首页 Java企业应用论坛

java两表大数据量明细对比问题

浏览 15519 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-11-08  
最近公司需要做一个财务对账的系统,要求是A、B双方数据表页面动态创建,数据通过上传或者外部系统下发入库,数据量一般每次对账每张表100w-500w,需要维护一个对账规则,规则是动态配置的,如 A表某字段 = B表某字段, A表A1字段+A2字段 = B表B1字段+B2字段, A表某几个字段拼接 = B表某几个字段拼接 等等复杂的对账规则,然后后台根据对账规则来进行对账处理操作。 本人想到一下两种方式:

(1) 维护对账规则时将对等的字段动态建立索引值, 然后将对账规则解析成 AB两表关联的where 字句,然后分页进行查询,查询到的数据 就是对上的数据,记录标示,未查询到的数据视为差异数据。

(2) 维护对账规则时将对等的字段动态建立索引值,分批循环A表数据,解析对账规则从B表中查找数据,查找到数据记录标示,未查找到的数据视为差异数据。


但是这两种方式效率都不高,对账规则复杂的可能导致数据库临时表空间不足等系统问题,特发帖寻求有效解决方案,非常感谢。
   发表时间:2013-11-08  
坐等高手出现
看看怎么解决内存和效率两个问题
0 请登录后投票
   发表时间:2013-11-13  
这个跟你的业务紧密相关。 如果只是让客户制定表字段和上传数据,之后的主要业务是查询,查询过程不追求实时数据,我提供一种方法:在制定表和上传数据完成后,把这两个表做相应查询,把对的上的和对不上的分别放到两个新的表(或临时表)中,以后的查询都从这两个新的表中查询,才不到两百万的数据量,毫无问题。
0 请登录后投票
   发表时间:2013-11-13  
才200w数据,直接把所有数据加载到内存,一个main方法足够了。
0 请登录后投票
   发表时间:2013-11-13  
设置实时数据也没有问题,新增的数据跟新的两个表作比较,比较之后插入到对应的表就行。
而数据库从两个百万计的表中查询对应数据时间很轻松的事。
0 请登录后投票
   发表时间:2013-11-14  
A、B表新建一个零时字段,对账之前,根据规则将值生成的值保存到零时字段,然后直接通过该字段进行对账操作,可以解决索引过多导致表空间不足。
0 请登录后投票
   发表时间:2013-11-14  
同意2楼的看法,既然连对账的规则都不一样,是没有办法做到很简单的来对账的,这和业务的相关性太大

建议把每种对账规则封装成一种服务,尽可能重用,至于底层的数据,还是保留源数据
0 请登录后投票
   发表时间:2013-11-14  
对账规则可分拆进行,降低规则的复杂度
0 请登录后投票
   发表时间:2013-11-16  
须等待 写道
同意2楼的看法,既然连对账的规则都不一样,是没有办法做到很简单的来对账的,这和业务的相关性太大

建议把每种对账规则封装成一种服务,尽可能重用,至于底层的数据,还是保留源数据



是的,根据对账规则可能是要做全量匹配循环的,数据库处理 基本上是不行了,有的规则索引是不起作用的,现在的想法是牺牲内存, 将两边数据分成很多对进行处理,然后错开再比对,如 1-1 2-2 .... 再 1-2 2-3 ... 比对成功的数据就去除掉,A方所有份数据和比方比对完之后就结束任务。 内存量很大也是个很头疼的问题。也想用redis来做缓存数据存储,但是比对还是得把数据捞到应用上处理,内存也节省不了多少
0 请登录后投票
   发表时间:2013-11-16  
houyujiangjun 写道
这个跟你的业务紧密相关。 如果只是让客户制定表字段和上传数据,之后的主要业务是查询,查询过程不追求实时数据,我提供一种方法:在制定表和上传数据完成后,把这两个表做相应查询,把对的上的和对不上的分别放到两个新的表(或临时表)中,以后的查询都从这两个新的表中查询,才不到两百万的数据量,毫无问题。


您说的是用数据库端进项比对的吗, 主要是比对的时候的性能问题, 两边两百万数据load到内存中的话,大概消耗2G左右的内存, 多个对账任务的话 数据量就会很大, 排队处理的话 其他任务等待时间就会很长,很头疼的问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics