现在从远程数据库抽取100w+的记录,总是提示ORA-04030: out of process memory when trying to allocate 16408 bytes (koh-kghu call ,pmucalm coll)
我查了网上的资料需要修改数据库配置文件,说是PGA or SGA太大了,sort_area_size改为了2048000,但是DBA说现在数据库环境配置是最优的,我看不到当前设置值,只好从抽取技术上想办法。sql并不复杂主要是源和目标表太大了,过程用游标控制10w提交一次,速度太慢让人无法容忍,100w提交一次又出现错误04030。现在只能通过临时表中转,有没有什么更好的方法?谢谢!

解决方案 »

  1.   

    一次提交100W难道会比10W快?10W也差不多了吧
      

  2.   

    这个板块的人气好差啊..查询语句就是一个标准的select语句,没有任何运算,然后移动指针一条一条读,然后一起存入表里。回滚段现在是2G,应该不是这个问题。
      

  3.   

    估计是死循环或死递归, 一直做到oracle死掉为止~
      

  4.   

    这个板块的人气好差啊..查询语句就是一个标准的select语句,没有任何运算,然后移动指针一条一条读,然后一起存入表里。回滚段现在是2G,应该不是这个问题。-------------------------------------------
    难道你真的仅仅是Select简单逻辑来搬移数据?拜托,如果是这样,你用得着一条一条用Cursor来存,吗?直接Inset into xx select * from xx where rownum < 100000;commit;外面来一个循环不就行了??还有谁说100W提交一次就比10W提交一次快了?这要看你的回滚表空间大小,日志文件大小来考虑。一般对于小型机以下的服务器应用10W已经是上线了,个人经验!!!!
      

  5.   

    创建个DB——LINK连接过去
    把目标表删除掉
    然后
    create table target_table as select * from source_table@db_link_name;
    这样搞一下,千万条记录的表都是很快的,只要网络好
      

  6.   

    去掉select中没必要的字段,可以节省点空间