大家好!有一个系统,系统中有一个对象(一张表,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由系统自动生成。现在的问题是两个系统都有几万条数据,如何操作才能提高效率??
 

解决方案 »

  1.   

    由于学艺不精,提出此问题,和大家一起讨论哈。首先,我想肯定不能去两个数据在LIST中用For循环比吧。
    一来数据量太大,两边取速度肯定慢。
    二来不知道list有没有这么强大。没试验过,而且用for肯定慢,个人感觉
      

  2.   

    insert into inTab
    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
    );
      

  3.   

    我的初步想法是:由于是两个系统,但是都不能直接操作数据库,可以通过接口抽取数据
    所以可能有三种模式:第一,取A系统的全部数据,然后去B系统对比,然后更新B系统。
    第二,取B系统的数据,然后去A系统对比,取对比后的结果返回更新B系统。
    第三,取A系统的所有数据,取B系统的所有数据,放入中间数据库,对比后再更新B系统。不知道哪种模式效率最高?或者有其他的办法。因为系统中数据不是固定的,是增长的。每月增加原数据50%左右。
      

  4.   


      取数的系统A是oracle数据库,要更新的系统B数据库是隐藏的,只能通过它提供的接口更新。并且每次只能更新20条数据。所以我才想着先把B系统的数据抽出来,再在Oracle中比完之后把结果更新到B系统中,这样数据量会小很多
      

  5.   


    加个标记位,未同步过的置1,同步过置0,修改过或者新增的置1,(delete的不知道你们业务怎么样)。
    每次只搜索没有同步过的即可。如果是oracle,可以考虑dblink+merge into语句,一个sql全部搞定,而且还很快。
      

  6.   

    回 3楼:   呵呵,谢谢支持,由于B系统(目标系统)不能操作数据库,只能通过接口抽数, 你说的这种方式必须要我把B系统(目标系统)中的所有数据先抽取出来放在oracle中,然后对比,对比完后再通过接口更新B系统(目标系统)。
     差不多是我上面说的第三种思路。
       但是由于通过接口抽数速度慢,所以我想提高效率,抽数的步骤数据尽量少。谢谢支持。
      

  7.   


    我说的标志位,只需要在你取数据的A系统添加。至于B,你只要吧A系统修改了的每次20条去调他的接口即可。B系统什么都不用改。
      

  8.   


    呵呵,这个我明白啊,这样A系统每次取的数至少就少了60%,只是他们要维护A系统的标志位,不是一个项目组,不知道他们乐意不?现在也只能从A系统入手了。  然后取B系统的id和num和A系统的 num对比,有 id就更新,没id就插入。
    再请教一个小问题:
    当我通过接口取B系统数据时,是将B系统中的所有数据取出来和A系统对比,还是取B系统中一条一条的数据对比快呢。
      

  9.   

    你不是拿a的去update b吗?不用管b的数据。
    如果非要管,建议是批量取。
      

  10.   

    是啊, 主要是不全是Update啊,要根据 num 判断啊,如果B中有这条数据就update,
    没有就insert