定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?谢谢各位大侠!
[quote]
这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?
[/quote]
这个真的是比较困难。
首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口),所以你只能全部取出来,依靠自己的程序去同步数据。
我见过的做法是:
假设用户机是A(Oracle),你的java应用部署在B机器上,sybase数据库在C机器上。
(1)B机器上安装一个内存数据库(有一个开源的H2内存数据库)
(2)获取A(Oracle)的全部数据,如果B机器的内存不大,那么分批获取也可以,与B机器上的内存数据库中的临时储存表Temp做hash join,得到增量数据。
(3)把增量数据同步到B机器的内存数据库和C机器的sybase上。
这里,说明一下,需要同步的表是每隔一段时间会重新建立的,比如天表、月表等,所以一个表不会超级大,达到内存无法消化的地步,所以这个内存数据库的临时表也是有一定的容量的。
可能还有更好的方式,不过,中间表或中间文件记录应该还是要的。
考虑一下几种方法:
将源表同步到目标数据库(改成一个临时表)
方法一: 两个表数据量都不大的情况下,使用union关键字去掉重复数据后,把得到的数据重建建一张表,删除以前的表,改名为目标表。
方法二: 数据量稍大,使用minus关键字,获取存在于源表但不存在于目标表的数据,然后将的到的差集一条一条地插进目标表。
方法三: 目标表建立索引,查询出源表当中不存在于目标表的数据(使用exists关键字,不要用in),然后将得到的数据一条条地插入到目标表中。
以上方法,如果是在oracle数据库中,建议使用pl/sql程序完成,速度快!
[quote]这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。[/quote]
一样的,程序也操作数据建表,使用pl/sql程序,做集合运算等操作,我说的是大部分操作使用数据库完成,这样能显著提高效率,如果只是用java程序的话,那考虑下面两种方法:
1 源表中的数据一条一条地取出来,对比目标表,实现不重复插入;
2 两个表的数据都取出来,采用内存hash join的方式,得到源表-目标表的差集数据,然后插入到目标表中
[quote]
这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!
[/quote]
我还想问一个问题,重复数据是oracle表数据有重复,还是oracle表与sybase表的数据有重复?
如果是oracle表数据有重复,这个最好办,oracle的数据查询出来,使用distinct或union select * from dual一下,就能把重复数据去掉了。
如果是oracle表与sybase表的数据有重复,那么在不读取sybase表的情况下,怎么知道oracle表中哪些数据是重复数据呢?
[quote]
理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!
[/quote]
oracle表中增加读取标识位字段,默认为0,已经同步过的,设置标识位为1,下次oracle表再有新数据增加的话,那么只读标识位为0的就可以了。
如果不想破坏oracle表的结构,自己在oracle上新增一个临时表,来存储已经同步过的oracle数据的主键标识也行。