问题如下:
程序中导数据操作涉及的数据量很大,于是采用分批导入的方法,每导完一部分数据,就进行提交。但仍会报回滚段不足的错误,经查是因为每次提交后,回滚段空间并未得到释放,并不是回滚段空间不足所致。曾试过以下方法:
在导数据前指定使用某一个固定的回滚段set transaction use rollback segment rbs10。采用这种方法后,在连续到大量数据时,仍会报错!请大家帮忙看一下这是什么问题,谢谢!

解决方案 »

  1.   

    oracle的策略是:
    一旦一个事务完成,它的数据不会从回滚段中删除。旧的回滚数据保留在回滚段中,以
    便对提交前开始执行的事务和查询提供服务。
      

  2.   

    to: vanco (恍然大悟)  
       你是怎样查到回滚段没有释放的?
      

  3.   

    to:  black_dragon(半仙) 
         在DBA Studio中查看表空间to:  maohaisheng(www.chinaspirit.net)
         但是我每做完一个事务均进行了提交,为什么仍不释放呢?
      

  4.   

    to:  black_dragon(半仙)
    也可用以下语句查看表空间
    查看表空间中已经使用的空间:
    select ts.tablespace_name,nvl(count(extent_id),0) extents,sum(nvl(bytes,0)) bytes_used,sum(nvl(blocks,0)) blocks_used
    from dba_tablespaces ts,dba_extents ex
    where ts.tablespace_name=ex.tablespace_name(+)
    group by ts.tablespace_name;
    查看表空间中的自由空间:
    select ts.tablespace_name,nvl(count(fs.block_id),0) free_extents,sum(nvl(bytes,0)) bytes_free,
    sum(nvl(blocks,0)) blocks_free,max(nvl(bytes,0)) largest_free_extent
    from dba_tablespaces ts,dba_free_space fs
    where ts.tablespace_name=fs.tablespace_name(+)
    group by ts.tablespace_name;
      

  5.   

    事务处理完毕之后,其所用的回滚段数据块被标记为inactive(非激活),便可以被其它事务使用。单一事物下,如果事务处理的数据量大,使用完所有的回滚段范围,就可能报错;多事务情况,一个事务没有完成,其占用的回滚段范围就不能被其他事务使用,并发运行的事务需要的回滚空间大于数据库可提供的回滚段空间,也会报错。
      

  6.   

    ----------------------------------------------------------
    to:  maohaisheng(www.chinaspirit.net)
         但是我每做完一个事务均进行了提交,为什么仍不释放呢?
    ----------------------------------------------------------
    主要是为了应付在事务开始之前已经运行的SQL语句。多创建几个回滚段几个吧