现在要做个表同步,A表的增删改操作,要实时的修改到B表去。
我想到的方法有, 
1.写个job 每隔一分钟比较A,B表,如果有改动就A同步到B表上去。但这个方法如果表大,费时间,费CPU内存。
不知道有没有其他方法?比如有没有办法能查到表记录是发生改变,那就能定时的去在B表上做相应修改。

解决方案 »

  1.   

    上述答案都有解法,而且都是不错的,其实触发器是最简单也是最直接的办法;不过需要注意的一点触发器会引发一些问题,主要是在高并发写入时的性能,另外还有就是一个强制依赖性关系,还有些其他的隐患,不过很多时候用触发器来解决问题比较方便,所以我们很多时候都说这个东西有点像给系统贴膏药,但是能很快见效,但难免留下些后遗症,至于后遗症是否会发作来看身体状况和环境需求。而物化视图来说,相对是通过oracle来实现的,其增量刷新的机制有点类似于触发器(按照你提供的资料,使用增量刷新是必然的),给你的感觉是这样的,但是它并不消耗性能,因为它并不强制依赖于业务操作,它是通过log去完成的,但是物化视图在使用过程中也存在一定的局限性,主要在于它的视图方法不能有复杂的查询,尤其是子查询嵌套它很多时候报些怪错误出来,所以用起来很烦,限制性太多,当然如果A表和B表之间没有太复杂的计算就可以拷贝过去,物化视图的确是一个很好的办法。对对于你的方法楼主,为什么会每次那么慢呢,因为你对比的是全量数据,而且每次做全表扫描,不仅仅会对比慢,你的查询也会影响一定的正常业务操作;如果你要继续你的思路,你可以尝试通过设计的手段来完成一些工作,那就是加一个字段叫做:modified_time,当INSERT是写入当前系统时间,UPDATE操作时写入当前系统时间;delete是先逻辑删除,并将该时间写为当前系统时间。每次读取一个比你上一次对比时间大的时间戳作为WHERE条件,并在这一列上面建立索引(我想你几分钟对比一次,这个数据量不会太大吧),此时将这个增量数据拷贝做出来对比即可,做新增的直接写过去,做修改的直接UPDATE过去,做DELETE的你直接做逻辑删除或者此时将两边都做物理删除也无所谓;这个方法在oracle层面可以基于一个本身的回滚段的时间戳来完成,不过这个建议不要用,它要依赖于UNDO的大小(顺便说下,每次对比完成后,你要记录下最后一次对比时间到某个地方。下一次对比是从这个时间点取数据)。最后如果是双机这种数据拷贝,一对一模式情况下,使用dataguard就OK了,不过它是数据库级别的,并且它可以支持最佳性能模式,做逻辑备库即可;一对多的情况,如果有兴趣可以自己尝试解析log,这个就非常复杂了,仅仅参考而已!
      

  2.   

    你可以隔一段时间(比如1h)同步一次,这样就避免了cpu即其他资源的抢占;
    或者使用触发器,使用merge into,相同连接字段的就update,若是新数据,那么就insert