a表(a,b,c,d)    远程数据库 只有只读此表的权限
b表(a,b,c,d)    本地数据库 自己的电脑,sys权限
a、b表a均为主键已经有dblinka表每天晚上1点更新数据2万条数据左右(不会少于),现已经存在10万数据左右b表存在8万条数据左右,现在要将a表的数据插入到b表中,促使2个表的数据同步原来数据量少的是很我是用触发器
触发
insert into b
select * from a@dblink where a not in(select a from b)
的,但现在发觉越来越慢了···看了一下物化视图,又要在远程数据库动手脚,行不通···请求各大侠有何高效率的方法··(回去再吃饭再上来聆听指导··)

解决方案 »

  1.   

    在b表上建合适的索引,然后把条件not in 改成 not exists ,速度应该快不少
      

  2.   

    这种定点执行的任务,用job再好不过了~~~
      

  3.   

    触发器中把b表truncate再重新导入a的数据会不会快一点
      

  4.   

    既然一天更新一次,就不要用触发器。每天定时1点更新a表,你可以再创建一个job 1:30的时候更新b表。将更新语句写到过程里
    关于插入的语句,可以试试merge into 的效率怎么样
    merge into b t1
    using a@dblink t2
    on (t1.a=t2.a)
    when not matched then
    insert values(t2.col1,t2.col2,t2.col3..);
      

  5.   

    这个问题有点没看懂,a表中的数据是每天晚上新增2w条数据还是update 2w条数据,
    看你的做法,好像是新增,而且原有数据没有变化。
    如果是这样,那么这张表的数据增加量是非常庞大的,每天2w条,1个半月就是百万的数据量级,再用这么原始的办法,除非你的系统是很不错,不然效率问题是非常麻烦的。
    最好的办法是a表加时间戳,通过时间戳来进行2张表之间数据的同步,而且a表进行分区。
      

  6.   

    merge into b
    using a@dblink a
    on(a.a=b.a)
    when matched then
    update set b.b=a.b,
               b.c=a.c,
               b.d=a.d
    when not matched then
    insert (b.a, b.b, b.c, b.d)
    values(a.a, a.b, a.c, a.d);
      

  7.   


    merge into不错,假如你的机器能处理的过来,可以加上 /*+ parallel(table_alias,5) append */