现有表 a  
字段 id,t2,t3,...t10
t2 varchar2(20)
t3 number(20)
需要
update a set t2=t3 就这么简单但是数据10亿之内
如何提高更新时间
undo 5G
归档空间无限
cpu 8 核谁能给个最优方案

解决方案 »

  1.   

    一次性的直接update不行么?
    经常修改的做触发器不行么?
      

  2.   

    分成若干部分来更新
    update a set t2=t3 where id between :1 and :2;
    commit;
      

  3.   

    根据id 那就不能按照rowid顺序了,也就是说不能多块读取了 效率更低
    靠 。我在讲课莫
      

  4.   


    看这样行不update (select a.t2 col1,b.t3 col2 from tb a,tb b where a.id=b.id) set col1=col2
      

  5.   

    看看tom的书,可以根据rowid分批处理
      

  6.   

    由于涉及到索引的大量更新,时间开销巨大。
    建议先diable掉所有的index以及primary key和constraints
    然后调用上述更新语句,
    最后重新enable那些索引相的东东
      

  7.   


    恩 是的 昨天运气好,发现了tom 这个牛人;我现在纠结于rowid的分批方案,资料太少
      

  8.   


    谢了,我是准备drop index;disable 和drop效率相同吗?我估计是drop后快
      

  9.   


    disable应该更快一些,维护量更少。你可以试一下。
      

  10.   

    我最近更新1亿2千万数据。由于数据迁移工作,数据不是实时数据。不能直接更新,直接更新后果不堪设想。我们最后方案:一、通过ID分割若干个表。(table1,table2,****,tableN)二、把分割的表的物理文件大小控制在200M左右,
    查看表的物理空间语句如下:select segment_name,sum(bytes)/1024/1024 a from user_extents group by segment_name order by a desc;三、建立若干表索引,检查执行计划和统计信息(在现网操作之前,取出小部分数据必须做测试)四、写存储过程循环更新希望能帮到你,提供些思路。
      

  11.   

    disable 所有约束,删除所有索引, 采用并行sql ,估计会比较快吧。
    alter table a nologging ; 
    alter session enable parallel dml ; 
    update /*+parallel(a 10) */ a update a set t2=t3  ;我测试了个例子,64305947 行数据在2951.75 秒内完成。测试的那个字段是中文字符,长度在100 char 内的update字段。仅供参考。
      

  12.   


    up今天正好学习到disable和enable主键,索引。