日期:2014-05-16  浏览次数:20482 次

为什么通过DB link迁移部分数据到本地,但是网络传输的却是所有数据到本地
最近在写个同步数据的存储过程,其中有一步就是把远程服务器中的数据SELECT一部分出来INSERT到本地服务器的表格中,通过DB link实现两台Oracle服务器的链接,源数据所在的视图数据量比较庞大,近千万条,但是我每次根据条件SELECT出来的数据只有几十条到几百条不等,这整个过程花费了20多秒的时间,但是我仅仅根据相同的条件进行查询操作,只需要2秒钟左右。语句如下:
INSERT INTO local_table_a(aa,bb,cc,dd,...)
SELECT aa,bb,cc,dd,...
FROM distance_table_a@DB_LINK
WHERE aa='12345';
    经过多方测试,大胆的猜测下原因:select语句只会把过滤后的数据保存到本地服务器内存;而INSERT语句则会将源数据表的所有数据通过网络传输到本地,再进行过滤、插入操作,由于数据量庞大,网络传输需要的时间就多很多(实际插入的数据量很少,所以时间肯定不是花在插入这个动作上)。
    为了验证这个猜想,我选择了另外一个迁移的操作,把源数据量比较少的一张表里的数据(约1500条)全部插入到本地表中,同样的语句:
INSERT INTO local_table_b(aa,bb,cc,dd,...)
SELECT aa,bb,cc,dd,...
FROM distance_table_b@DB_LINK;
    总共费时0.6s。
    至于为什么Oracle会出现这种情况,想了两天也是不得其解(对其他数据库不了解,不知道是不是也是这样)。希望能有高人帮忙解答下。
    对于这个问题,我自己想了个办法就是在远程服务器端建立个中间表,本地端从那个中间表获取数据,这样网络传输的就只有SELECT之后的数据,就能节省很多时间。不过问了下主管,由于涉及信息安全,远程数据库不会给我们这个权限的。。。
    求高人帮我解决下如何控制好时间,最好能在5S之内。或者有没有其他的方法来实现数据的同步。。。