关于undo的ora-30036(存储过程循环提交)

[复制链接]
查看11 | 回复6 | 2010-10-8 09:31:22 | 显示全部楼层 |阅读模式
在数据库执行一个for循环的存储过程
比如loop,100万行提交一次。
for i in 1..100 loop
update table
commit
end loop
为什么在提交了1200万行后,第13次循环报错:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'
然后我再执行,只循环了一次,提交了100万行就报错了。
我以前的对概念的理解是commit以后,新的循环应该可以占用旧的undo空间(虽然没达到undo retention的超时时间)
我本以为按这样提交不会有undo方面的报错。
不知道我的理解错在哪里,除了扩展表空间是否有其他解决途径?
谢谢各位。
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
顶上去
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
update的时候一部分一部分commit;
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
原帖由 rman不是man 于 2010-12-18 01:16 发表
update的时候一部分一部分commit;

回楼上,我的sql里面是100万行提交一次的。
每提交1000万行,大概吐出15G归档日志。
问题是我需要改成10万行提交一次吗?如果这么做可以成功,理由是什么?
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
要在undo retention的超时时间外 才能重复利用undo空间吗
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
zhuanke 发表于 2012-2-22 14:59
要在undo retention的超时时间外 才能重复利用undo空间吗

对,需要查一下参数undo retention的值,结合着你的语句执行时间,如果有其他语句同时执行,需要综合考虑,可以增加undo大小。
回复

使用道具 举报

千问 | 2010-10-8 09:31:22 | 显示全部楼层
本帖最后由 warehouse 于 2012-2-22 15:55 编辑
undo retention设置为guarantee了吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行