大家好!有一个系统,系统中有一个对象(一张表,inTab),字段如下:主键为idid name age num
00a1 a 18 ss 01
00b3 b 16 aa 03
005h n 19 ss 04
有另一个系统,有一个对象(一张表,outTab)。字段如下:主键 num
num name age length
01 a 19 10 ss
02 s 17 9 bb
03 s 17 23 cc现在的业务逻辑是这样的,把outTab表中的数据取出,update或者input到inTab中,入列以上例子
首先通过outTab表中的 num 的值 查找 在inTab表中查找数据,如果在inTab表中数据已存在,就用update,
由于是两个系统,系统只提过接口,所以Update的方法为
(1)通过outTab表的num 查找 inTab表的id,
(2)取出inTab表的id,再根据 inTab 的 id 把ouTab表中的数据更新到inTab中。例如第一条数据 num 是 01,取 inTab 表的id是00a1,然后根据00a1将 outTab中的记录更新到inTab中。
最后结果是
00a1 a 19 ss 01 注意:年龄更新为 19 了。如果 outTab表中num 在 inTab中无记录,查不到 id,就 insert. 如outTab表中的第二条数据02 s 17 9 bb 插入inTab表中,其中id由系统自动生成。现在的问题是两个系统都有几万条数据,如何操作才能提高效率??
一来数据量太大,两边取速度肯定慢。
二来不知道list有没有这么强大。没试验过,而且用for肯定慢,个人感觉
select o.* from outTab o where not exists
(
select i.num inTab i where i.num = o.num
);update inTab i set i.XXX = (
select o.XXX from outTab o where o.num = i.num
)
where exists
(
select o.num outTab io where i.num = o.num
);
所以可能有三种模式:第一,取A系统的全部数据,然后去B系统对比,然后更新B系统。
第二,取B系统的数据,然后去A系统对比,取对比后的结果返回更新B系统。
第三,取A系统的所有数据,取B系统的所有数据,放入中间数据库,对比后再更新B系统。不知道哪种模式效率最高?或者有其他的办法。因为系统中数据不是固定的,是增长的。每月增加原数据50%左右。
取数的系统A是oracle数据库,要更新的系统B数据库是隐藏的,只能通过它提供的接口更新。并且每次只能更新20条数据。所以我才想着先把B系统的数据抽出来,再在Oracle中比完之后把结果更新到B系统中,这样数据量会小很多
加个标记位,未同步过的置1,同步过置0,修改过或者新增的置1,(delete的不知道你们业务怎么样)。
每次只搜索没有同步过的即可。如果是oracle,可以考虑dblink+merge into语句,一个sql全部搞定,而且还很快。
差不多是我上面说的第三种思路。
但是由于通过接口抽数速度慢,所以我想提高效率,抽数的步骤数据尽量少。谢谢支持。
我说的标志位,只需要在你取数据的A系统添加。至于B,你只要吧A系统修改了的每次20条去调他的接口即可。B系统什么都不用改。
呵呵,这个我明白啊,这样A系统每次取的数至少就少了60%,只是他们要维护A系统的标志位,不是一个项目组,不知道他们乐意不?现在也只能从A系统入手了。 然后取B系统的id和num和A系统的 num对比,有 id就更新,没id就插入。
再请教一个小问题:
当我通过接口取B系统数据时,是将B系统中的所有数据取出来和A系统对比,还是取B系统中一条一条的数据对比快呢。
如果非要管,建议是批量取。
没有就insert