test表裡有幾十W筆數據,我一次一交三W筆就很慢,我一般建一個表把要更新的數據放到那然後做關連批量更新,有沒有更好的方法啊,或者可以加hinst來加快速度..望高手指點

解决方案 »

  1.   

    我觉的你先insert一张表,再更新这张表的话,insert同样需要很多时间啊,还不如直接更新,数据很多很多时可以用存储过程,进行批量更新,可以多少数据量commit一次
      

  2.   

    分段commit,
    给你个参考程序只要把表名修改下就可以了。
    SUM_60_EVENT是原表,symac是要导入的表create or replace procedure pro as
    cu sys_refcursor;
    symc SUM_60_EVENT%rowtype;
    begin
    open cu for select * from SUM_60_EVENT;
    loop
    fetch cu into symc;
    exit when cu%notfound;
    insert into symac values symc;
    if mod(cu%rowcount,50)=0 then
    commit;
    end if;
    end loop;
    commit;
    end;
      

  3.   

    1.倾向于在关键字上建立索引后的删除方式;
    2.写个存贮过程:
      a.每次一定数量后,进行commit;
      b.每次全部删除后可能对其索引rebuild;
    3.Job中执行此存贮过程,时间最好按排在服务器较空闲的时间里,如凌晨。
      

  4.   

    我给的例子是insert,你要改成update的。
      

  5.   

    1、十几w条记录很少,一次性更新3w条记录也不算多。
    2、update语句怎么写的直接影响你的执行效率
    3、一般来说,insert要比update快
    4、如果采用insert的方法,那就把数据插入到临时表中
      

  6.   

    在更新一部分数据之后分段COMMIT;
    更新之前去掉索引,更新之后重建索引;
    效果应该会好很多。
      

  7.   

    可以采用5楼给你的办法,但是需要改进。使用绑定变量技术,采用这样的insert格式:insert into test select ...
      

  8.   

    用bulk collect + forall处理视数据量大小隔一段时间COMMIT一次
      

  9.   

    rebuild不见得是个好办法, 尤其是在客户端操作的时候, 因为User几乎不可能有rebuild这么大的权限
      

  10.   

    grant create any index to userA;