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)
的,但现在发觉越来越慢了···看了一下物化视图,又要在远程数据库动手脚,行不通···请求各大侠有何高效率的方法··(回去再吃饭再上来聆听指导··)
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)
的,但现在发觉越来越慢了···看了一下物化视图,又要在远程数据库动手脚,行不通···请求各大侠有何高效率的方法··(回去再吃饭再上来聆听指导··)
关于插入的语句,可以试试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..);
看你的做法,好像是新增,而且原有数据没有变化。
如果是这样,那么这张表的数据增加量是非常庞大的,每天2w条,1个半月就是百万的数据量级,再用这么原始的办法,除非你的系统是很不错,不然效率问题是非常麻烦的。
最好的办法是a表加时间戳,通过时间戳来进行2张表之间数据的同步,而且a表进行分区。
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);
merge into不错,假如你的机器能处理的过来,可以加上 /*+ parallel(table_alias,5) append */