合并、分区和远程数据库 - Oracle性能调整

问题描述 投票:1回答:1

我想调整我的合并查询,根据SQL Server的源表在Oracle中插入和更新表。表的大小约为1.2亿行,通常每天插入和更新约12万条记录。合并需要大约1.5个小时来运行。它使用嵌套循环和主键索引来执行插入和更新.在源表中没有记录更新日期可以使用,所以所有记录都会被比较。

Merge abc tgt
using
(
   select a,b,c
   from sourcetable@sqlserver_remote) src
  on (tgt.ref_id = src.ref_id)
when matched then 
update set 
      .......
where 
    decode(tgt.a, src.a,1,0) = 0
     or ......

when not matched then 
insert (....) values (.....);
commit;

由于表很大,而且每天都在增长,我在DEV中根据ref id(10组)对表进行了分区,并在ref id上创建了本地索引,现在它使用了hash join和全表扫描,而且运行时间比现有进程要长。

有什么方法可以调整进程的性能。

谢谢...

sql oracle merge oracle12c partitioning
1个回答
0
投票

我会谨慎地通过数据库链接来joinmerge巨大的表。我会尝试把完整的源表复制过来(比如用一个非原子的mview,可能是压缩的,可能是排序的,当然只有你需要的列)。在收集统计后,我会将目标表与本地副本合并。之后,可以对本地副本进行截断。

如果分区能加快从本地副本到目标表的合并速度,我也不会感到惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.