在本地库建立一个dblink,通过其访问远端对象,是否需要使用远端库的回滚段。例如:
insert into tb1
select * from tb2@dblink1;今天被人告知如果tb2太大了的话,可能会引起远端的回滚段不足,要我分批获取,我晕了,select查询也需要使用回滚段吗?上面这种写法应该只会占用本地的回滚段啊!!如果占用,主要是以什么形式,会占用多大的规模?请高人赐教!顺便解释下这个现象:
使用在PL/SQL Developer中打开一个sql窗口,执行一个查询select * from tb2@dblink1,这个时候原本灰色的COMMIT和ROLLBACK按钮都会高亮显示。
insert into tb1
select * from tb2@dblink1;今天被人告知如果tb2太大了的话,可能会引起远端的回滚段不足,要我分批获取,我晕了,select查询也需要使用回滚段吗?上面这种写法应该只会占用本地的回滚段啊!!如果占用,主要是以什么形式,会占用多大的规模?请高人赐教!顺便解释下这个现象:
使用在PL/SQL Developer中打开一个sql窗口,执行一个查询select * from tb2@dblink1,这个时候原本灰色的COMMIT和ROLLBACK按钮都会高亮显示。
如果想不占用远端的回滚段,除非设置事务隔离级别为允许脏读(但对于远端是否好用不清楚)。
2、COMMIT和ROLLBACK按钮都会高亮显示。
原因就是为了取消查询用的,好释放占用远端的回滚段、锁等信息。
select * from tb2@dblink1;
DBA告诉我如果tb2太大可能引起远端回滚段不足,要我分批获取数据。
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;
虽然Cursor是一行行读的,但是数据集却是在Open是建立并保持到Cursor结束的。
分批提交只解决本次的回滚段或者撤销表空间的问题。远程的数据仍然需要保持住吧?