日期:2014-05-17  浏览次数:20744 次

update语句慢
UPDATE ONE T
   SET T.AGE =
       (SELECT T2.AGE
          FROM TWO T2
         WHERE T2.ID=T.ID
     ); 

ONE TWO 都是2百万级别的数据,update执行起来速度太慢了。有没有好的方法让速度快速提起来。
------最佳解决方案--------------------
ONE TWO 的id都建了索引了吧
------其他解决方案--------------------
如果id有索引的话, 可以分段update, 不要全表update,那样肯定是慢的。
------其他解决方案--------------------
1)索引建了吗?
2)控制事务单位,比如2000条update完一个commit
3)用Oracle专用的update也可以考虑:比如对视图的UPDATE语句


------其他解决方案--------------------
分段来更新这样可以防止死锁
------其他解决方案--------------------
循环ONE表,在循环体里面按条件一条条更新,5000次commit一下。
------其他解决方案--------------------
这个操作经常使用还是临时用一次,要是临时,可以创建一个新表,将需要的内容通过INSERT INTO SELECT 的方式添加进去,

要是是经常使用 建议采用 分批提交,可以考虑加上NOLOGGING
------其他解决方案--------------------
用merge into试试看
------其他解决方案--------------------
感谢各位,通过下面的方法解决的

declare
  row_num number := 0;
begin
for c_usr in (select login_id from im_user t where id is null) loop
   update im_user i set i.id =
     (select id from bmw_users u where i.login_id = u.nick)
   where login_id = c_usr.login_id;
   row_num := row_num + 1;
   if mod(row_num,100) =0 then
     commit;
   end if;
end loop;
commit;
end;