通过dblink的查询会占用回滚段吗?

heyixiang 2008-03-31 11:00:32
在本地库建立一个dblink,通过其访问远端对象,是否需要使用远端库的回滚段。

例如:
insert into tb1
select * from tb2@dblink1;

今天被人告知如果tb2太大了的话,可能会引起远端的回滚段不足,要我分批获取,我晕了,select查询也需要使用回滚段吗?上面这种写法应该只会占用本地的回滚段啊!!如果占用,主要是以什么形式,会占用多大的规模?

请高人赐教!

顺便解释下这个现象:
使用在PL/SQL Developer中打开一个sql窗口,执行一个查询select * from tb2@dblink1,这个时候原本灰色的COMMIT和ROLLBACK按钮都会高亮显示。
...全文
415 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
懒得去死 2008-04-03
  • 打赏
  • 举报
回复
select 一般是独占的。
qiyousyc 2008-04-03
  • 打赏
  • 举报
回复
肯定能改善,但你的游标代码的执行效率会很低下。
doer_ljy 2008-04-03
  • 打赏
  • 举报
回复
使用Cursor也解决不了资源占用的问题啊!
虽然Cursor是一行行读的,但是数据集却是在Open是建立并保持到Cursor结束的。
分批提交只解决本次的回滚段或者撤销表空间的问题。远程的数据仍然需要保持住吧?

heyixiang 2008-04-03
  • 打赏
  • 举报
回复
如果我通过游标批量绑定分批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;
heyixiang 2008-04-03
  • 打赏
  • 举报
回复
感谢 zhpsam109 doer_ljy qiyousyc,过两天就结贴。
heyixiang 2008-04-03
  • 打赏
  • 举报
回复
insert into tb1
select * from tb2@dblink1;


DBA告诉我如果tb2太大可能引起远端回滚段不足,要我分批获取数据。
qiyousyc 2008-04-02
  • 打赏
  • 举报
回复
1、肯定占用远端的回滚段。原因就是为了避免脏读。
如果想不占用远端的回滚段,除非设置事务隔离级别为允许脏读(但对于远端是否好用不清楚)。
2、COMMIT和ROLLBACK按钮都会高亮显示。
原因就是为了取消查询用的,好释放占用远端的回滚段、锁等信息。
西北刘五 2008-04-01
  • 打赏
  • 举报
回复
不占用
许毕峰 2008-04-01
  • 打赏
  • 举报
回复
学习中,没有在网上找到一个肯定的说法!
zhpsam109 2008-04-01
  • 打赏
  • 举报
回复
否需要使用远端库的回滚段???
要使用的吧,用于构建数据的读一致性视图!!!
CathySun118 2008-04-01
  • 打赏
  • 举报
回复
不占用远端库的回滚段
mmqingfeng 2008-04-01
  • 打赏
  • 举报
回复
占用本地的回滚段,不占用远端的
doer_ljy 2008-04-01
  • 打赏
  • 举报
回复
如果select执行的时间特别长,则会出现这样的情况。因为为了确保读一致性,在select过程中提交的数据是不能用的,因此必须从回滚段中读select执行前的数据,但由于时间太长,要读的回滚段已被别的事务使用过了(因为事务已提交),这样就会报快照过旧或回滚段不足的错误。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧