zoukankan      html  css  js  c++  java
  • Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有AB两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:

     

    创建用例表:

    create table test1(id number(10),name varchar2(20));

    create table test2(id number(10),name varchar2(20));

     

    测试数据:

    begin

    insert into test1 values(1,'A');

    insert into test1 values(2,'B');

     

    insert into test2 values(1,'C');

    insert into test2 values(2,'D');

    end;

     

     

    merge方式:

    merge into test1 using test2

    on (test1.id = test2.id)

    when matched then update

    set test1.name = nvl2(test1.name,test2.name,test1.name);

     

    merge方法是最简洁,效率最高的方式,在大数据量更新时优先使用这种方式。

     

     

    update内联视图方式:

    使用这种方式必须在test2.id上有主键(这里很好理解,必须保证每一个test1.id对应在test2里只有一条记录,如果test2中有多条对应的记录,怎么更新test1?),一般而言这种方式代价比merge方式稍高。

    alter table test2 add constraint pk_test2 primary key(id);  --/*+ BYPASS_UJVC */

     

    update (select /*+ BYPASS_UJVC */a.id aid,a.name aname,b.id bid,b.name bname from test1 a,test2 b where a.id=b.id) t

    set aname = nvl2(aname,bname,aname);

     

     

     

    使用并行,加快大量数据更新:

    merge /*+parallel(test1,4)*/ into test1 using test2

    on (test1.id = test2.id)

    when matched then update

    set test1.name = nvl2(test1.name,test2.name,test1.name);

  • 相关阅读:
    Android教程 -07 Activity的任务栈和启动模式
    ViewPager封装工具类: 轻松实现APP导航或APP中的广告栏
    hdu 5900 区间dp
    状压dp入门
    poj 3280
    hdu 4745 two Rabits
    食了智,过来水一发
    poj 2142 the Balance
    hdu 6188 Duizi and Shunzi
    hdu 6186 CS Course
  • 原文地址:https://www.cnblogs.com/quanweiru/p/4133682.html
Copyright © 2011-2022 走看看