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

在一个数据量上亿的表里面,如果高效的把符合条件的某一个值全部修改(符合条件的记录可能有1千万以上)
这是出去面试碰到的,该表要修改的字段已经建立了索引, 
直接update的话时间会非常久(update table1 set col='0')
  我给出的方案是用存储过程一条条的更新.面试的人似乎不大满意
  不知道大家有什么好的解决方法?

------解决方案--------------------
bulk collect+forall+rowid更新
------解决方案--------------------
比如emp的 sal创建了索引,差不多就是下面这种代码:

declare
  v_maxrows number default 1000;
  v_rowid   dbms_sql.Urowid_Table;
  cursor cur is
    select rowid from emp t1 where t1.sal = 810 order by T1.rowid;
  v_counter number;
begin
  v_counter := 0;
  open cur;
  LOOP
    EXIT WHEN cur%NOTFOUND;
    FETCH cur bulk collect
      into v_rowid limit v_maxrows;
    forall i in 1 .. v_rowid.count
      update emp set sal = sal + 10 where rowid = v_rowid(i);
    commit;
  end loop;
end;
/