请教下,我有两个数据库中各有一张结构完全相同的表,他们之间通过dblink可以互相访问数据。
现在我想从dblink1数据的的a表中将所有数据全部加入导dblink2的对应表中,a表中大约有2千万数据。
通过insert a select * from a@dblink1;commit来实现,现在的问题是:
内存不一定够,再有如果最后一次性提交的话,系统符合太大,而且速度奇慢,有没有办法能够实现每1W或是每100W数据commit一次??
还请达人不赐教。。

解决方案 »

  1.   

    --通过hint直接装载
    insert /*+append*/ into a select * from a@dblink1;
    commit;
      

  2.   

    本人对hint操作不熟,请问,append方式下,是不是每insert一条记录就commit一次?
      

  3.   

    加append,直接插在表后边,不用排序,插入速度快一些。
    还可以再在后边加上nologging
    insert /*+append*/ into a nologging select * from a@dblink1;
    commit;
      

  4.   

    写个循环,并判断数据量是否达到指定数目,如果达到就提交.//Connection conn;
     //PrepareStatement stmt;
     if(count = 10000){
      stmt.prepareStatement(sql);
      conn.setAutoCommit(false);
      stmt.clearBatch();
       
       //循环为sql设完值后
      for(... ...){
       stmt.setString(index,value);
       ... ...
      }
      stmt.addBatch();
    }
    stmt.executeBatch();
    conn.commit(); 
      

  5.   

    把目标表a alter table a nologging
    --alter index idxname unusable --禁用a的索引,完毕重建索引
    insert /*+append*/ into a select * from a@dblink1
    --commit--或者写个循环批量提交