在本地库建立一个dblink,通过其访问远端对象,是否需要使用远端库的回滚段。例如:
insert into tb1
  select * from tb2@dblink1;今天被人告知如果tb2太大了的话,可能会引起远端的回滚段不足,要我分批获取,我晕了,select查询也需要使用回滚段吗?上面这种写法应该只会占用本地的回滚段啊!!如果占用,主要是以什么形式,会占用多大的规模?请高人赐教!顺便解释下这个现象:
使用在PL/SQL Developer中打开一个sql窗口,执行一个查询select * from tb2@dblink1,这个时候原本灰色的COMMIT和ROLLBACK按钮都会高亮显示。

解决方案 »

  1.   

    如果select执行的时间特别长,则会出现这样的情况。因为为了确保读一致性,在select过程中提交的数据是不能用的,因此必须从回滚段中读select执行前的数据,但由于时间太长,要读的回滚段已被别的事务使用过了(因为事务已提交),这样就会报快照过旧或回滚段不足的错误。
      

  2.   

    1、肯定占用远端的回滚段。原因就是为了避免脏读。
    如果想不占用远端的回滚段,除非设置事务隔离级别为允许脏读(但对于远端是否好用不清楚)。
    2、COMMIT和ROLLBACK按钮都会高亮显示。
    原因就是为了取消查询用的,好释放占用远端的回滚段、锁等信息。
      

  3.   

    insert into tb1 
      select * from tb2@dblink1;
    DBA告诉我如果tb2太大可能引起远端回滚段不足,要我分批获取数据。
      

  4.   

    感谢 zhpsam109  doer_ljy  qiyousyc,过两天就结贴。
      

  5.   

    如果我通过游标批量绑定分批COMMIT能够改善吗?例如:open cur for
      select * from tb2@dblink1;
    loop
      fetch cur bulk collect into v_row limit 10000;
      for i in 1 .. v_row.count
      loop
        insert into tb1
          ()
        values
          ();
      end loop;
      commit;
    end loop;
    close cur;
      

  6.   

    使用Cursor也解决不了资源占用的问题啊!
    虽然Cursor是一行行读的,但是数据集却是在Open是建立并保持到Cursor结束的。
    分批提交只解决本次的回滚段或者撤销表空间的问题。远程的数据仍然需要保持住吧?