这是出去面试碰到的,该表要修改的字段已经建立了索引, 
直接update的话时间会非常久(update table1 set col='0')
  我给出的方案是用存储过程一条条的更新.面试的人似乎不大满意
  不知道大家有什么好的解决方法?

解决方案 »

  1.   

    比如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;
    /
      

  2.   


    如果是要在一个事务里面完成,更改要同时生效, 这样的做的和直接update, 效率上会高多少?
    直接update: update emp set sal = sal + 10 where  where t1.sal = 810
      

  3.   

    昨天我家UPDATE了一个表,里面有2千500多万数据,直接在plsql里面的sql窗口执行UPATE 同事说这样需要的时间非常长,还可能出现锁表的现象,让我直接在命令窗口执行,后面加COMMIT;就OK。