如题,通过DBLINK远程数据库取数据到本地数据库,由于远程表的数据量太大,接近1亿;因此,导到本地数据库,有时会出现回滚段不足异常
---------------------------------
以下方法验证不可行:
1.通过最笨的方法,rownum来分批取数据。经验证,当所取数据量达1000W左右,就跑不动了,所以也不可行。
2.根据远程数据库的分区,取数据。这种方法本地数据库是可行,但通过DBLINK会忽略分区,所以不可行。
3.在远程数据库中根据分区建立多个视图,再通过DBLINK,将视图导到本地库中,本方法可行,但是远程数据表
  是动态生成,不可能每次都去手工建立视图。也就是说,不要去操作远程库数据库,尽量在本地数据库操作。请教大虾,有没有好的方法可以解决这个问题?

解决方案 »

  1.   

    这么大数据量,dblink不可行,最好先导到数据库服务器,再传过来导进去比较可行。
      

  2.   

    我也是100万提交一次,但是当rownum达到1000万左右时,速度就相当慢
      

  3.   


     select count(1) into v_max_rownum from ct_intf_sf.bus26003_11090001a@ct_intf_online;
      while v_cur_rownum < v_max_rownum loop
      insert /*+append parallel(4)*/
      into audi.total_bus26003_sf nologging
        (twi_id,
         tbw_id,
         ck_state,
         state,
         file_row,
         file_name,
         field1,
         field2,
         field3,
         field16)
        select audi.seq_total_bus26003_sf.nextval,
               '353',
               'S',
               'N',
               null,
               null,
               nvl(cust_id,'null'),
                nvl(cert_type,'null') ,
                nvl(state ,'null'),
                nvl(cert_number,'null')
         from (select rownum num,a.* from ct_intf_sf.bus26003_11090001a@ct_intf_online a
         where rownum <=v_cur_rownum+1000000) b where b.num>v_cur_rownum;
         commit;
         v_cur_rownum := v_cur_rownum + incr_num;
       end loop;
    这是我写的存储过程
      

  4.   

    如果实时性不是很强的话,可以每天或每周做一次:
    1.exp本地库至date1.dmp;
    2.在异地建立表空间和数据库等授权后,将date1.dmp数据imp导入。如果考虑其可重复性,可在异地导入前,将前期数据删除后再实施导入。