那位大哥能帮小弟提高一下这个语句的效率,语句为:
update reduser_acct_item_t a
set a.user_name=(select b.user_name from wlmq.serv_subscriber_t@ods b
where a.serv_id=b.serv_id and b.state='00A');两个表中的数据都比较大,上百万的数据,表的serv_id上都有索引

解决方案 »

  1.   

    Declare
    Begin
    For x In (Select b.serv_id,b.User_Name
    From Wlmq.Serv_Subscriber_t@Ods b
     Where b.State = '00A') 
      Loop
      update reduser_acct_item_t a 
        set a.user_name = x.User_Name Where a.serv_id=x.serv_id 
    End Loop;
    End
      

  2.   

    update reduser_acct_item_t a set [email protected]_name 
     where [email protected]_id 
    and [email protected]='00A'
    不知会不会比你原先的快
      

  3.   

    怎么你的update 没有where 条件? 是要全部数据都做update吗?如果有条件可以限制update 的数据量,最好加上;更新数据量大的话,为了不占用大量的undo 空间,最好分批提交,这样的话就不能一个update 全部处理了;对于update 语句的效率,你的语句倒是很简单,就两个表,一个本地,一个远程表,应该是某一个做驱动,然后通过serv_id 之间的关联,来访问另一个表。 如果是本地表做驱动的话,必然是全表扫描,而且,如果是nested loop join 方式,会有多次的访问 远程表,代价会比较大。远程表的state 上是否有索引呢?是否控制 先访问远程表会好一些呢? DRIVING_SITE 这个hint 影响查询在本地或者远程执行,或许你可以用得上。如下是分批提交的一个例子,或许可以帮上你:SQL> declare
      2  i  number;
      3  begin
      4  for i in 1..100 loop
      5  delete  from  test1 where rownum<=10;
      6  dbms_output.put_line(i);
      7  if (sql%rowcount <10 ) then
      8  commit;
      9  exit ;
     10  end if;
     11  commit;
     12  end loop;
     13  end;
     14  /
      

  4.   

    都不可能快,还不如先做一个远程表的实体化视图,先更新实体化视图,在通过实体化视图做update
      

  5.   

    把远程的wlmq.serv_subscriber_t@ods b先写入当前SCHEMA的数据表再执行,另外reduser_acct_item_t是否有表级触发器影响更新的效率?
      

  6.   

    不知道你这个update语句是执行一次还是会经常执行,如果执行一次的话你可以划分细一些,分几次执行;如果是被调用执行的话令说