把一个十万记录的表内容merge into到另外一张表里,处理十分慢,超过10分钟,而仅仅是插入的话只需要1分钟不到,为什么呢,怎么可以提高merge into的效率,使用merge into上需要注意什么呢?

解决方案 »

  1.   

    merge 是把需要合并进去的数据,逐个与目标表比较,满足条件的更新,不满足的插入而直接插入就可以批量提交,当然快了。merge 的时候最好匹配条件上有索引,最好是唯一索引或者主键
      

  2.   

    Merge into 表A A
    Using(select * from 表B) B
    on A.ID=B.ID
    when Matched then
      update set name=B.name
    when not Matched then
      insert (A.Name) values(B.Name);--最重要的就是在A.ID和B.ID上建立索引,最好应该是B树索引.
      

  3.   

    找到原因了,是因为我再using里面的select语句有group by,去掉了就快了。
    但是发现有问题:
    1.在merge的时候,好像on里面的条件,不会检查这次的insert的内容,比如说using里面有两条记录,A|10,A|20,on的条件是第一个字段相等,符合的时候第二个字段相加,但是merge出来的结果是A|10,A|20,而我期望的结果是A|30。
    2.在把A表的内容merge到B表(merge前为空)里面后,在保留B表内容的同时,重新在把A表的内容merge到B表内,报错30926ORA-30926: unable to get a stable set of rows in the source tables
      

  4.   

    一般情况下,merge比同样功能的2条insert/update语句要快,merge并不是在判断完一次立刻就insert,而是把结果存储在临时空间,判断完了后一起insert到目标表中,从而提高效率,类似 forall..insert/update 的功能;merge只对源表数据进行检查,不会判断当前插入的值。