社区
Oracle
帖子详情
游标记录数量太大,时间太长,造成ORA-01555错误,怎么解决?
linzi
2008-08-05 11:00:16
各位高手,现在做的系统中有一个用户表,1700多万条记录,另有一个用户信息表,与用户表的ID对应,现在要根据用户表来插入用户信息表的内容,对用户表使用了一个游标,每循环一次,取得相应信息,写入到用户信息表中,用户信息表的字段比较多,每个循环里面的操作挺多,并且不能放到循环外面,现在的运行时间很久,并且经常会出现ORA-01555错误,这样的情况怎么解决?
...全文
481
14
打赏
收藏
游标记录数量太大,时间太长,造成ORA-01555错误,怎么解决?
各位高手,现在做的系统中有一个用户表,1700多万条记录,另有一个用户信息表,与用户表的ID对应,现在要根据用户表来插入用户信息表的内容,对用户表使用了一个游标,每循环一次,取得相应信息,写入到用户信息表中,用户信息表的字段比较多,每个循环里面的操作挺多,并且不能放到循环外面,现在的运行时间很久,并且经常会出现ORA-01555错误,这样的情况怎么解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kinlin
2008-08-21
打赏
举报
回复
1700万条,每次取出100万条,然后批插入或批更新,可能会好些
qfsb_p
2008-08-20
打赏
举报
回复
用这个东东理论上来说是性能是要高一些的,就好像是jdk中的preparestatment一样,这样可以通过减少在PL/SQL和SQL引擎之间的上下文切换来提高了效率,不过我没有用过。
linzi
2008-08-08
打赏
举报
回复
使用Forall、bulk collect性能会不会提高?
linzi
2008-08-05
打赏
举报
回复
[Quote=引用 7 楼 vc555 的回复:]
这个UNDO_RETENTION = 36000只是个期望值。如果你的撤销表空间不够大,这个参数也不顶用了。
如果实在没别的方法,你就配合retention guarantee来用。
[/Quote]
Undotablespace表空间很大,原来设计的时候设置成不限制大小,现在已经到了70G了,数据库是9i的,UNDO_RETENTION的大小也应该有限制,不能设置太大的值吧?
lynx
2008-08-05
打赏
举报
回复
把大业务的commit分成多个子commit。
我以前也是这样做的,分成小块一部分一部分的运行。
vc555
2008-08-05
打赏
举报
回复
这个UNDO_RETENTION = 36000只是个期望值。如果你的撤销表空间不够大,这个参数也不顶用了。
如果实在没别的方法,你就配合retention guarantee来用。
linzi
2008-08-05
打赏
举报
回复
1700万数据都要更新,UNDO_RETENTION = 36000了,现在是每5万条提交一次,原来字段数量少的时候才几分钟,后来增加了近三十个字段,5万条数据竟然要运行1个小时,已经分成若干个小块分别运行了,但是每次只能同时运行两三个小块,如果再多运行几个,同样会出现ORA-01555错误。
kelsoncong
2008-08-05
打赏
举报
回复
增加undo空间和undo_retention
oracledbalgtu
2008-08-05
打赏
举报
回复
1.在空闲时间做,避免其它事务报0ra-01555
2.增加undo空间和undo_retention。 只要足够大都能解决.
3.把大业务的commit分成多个子commit。
[Quote=引用楼主 linzi 的帖子:]
各位高手,现在做的系统中有一个用户表,1700多万条记录,另有一个用户信息表,与用户表的ID对应,现在要根据用户表来插入用户信息表的内容,对用户表使用了一个游标,每循环一次,取得相应信息,写入到用户信息表中,用户信息表的字段比较多,每个循环里面的操作挺多,并且不能放到循环外面,现在的运行时间很久,并且经常会出现ORA-01555错误,这样的情况怎么解决?
[/Quote]
vc555
2008-08-05
打赏
举报
回复
对于ORA-01555,一般考虑:
1、优化SQL,如不能优化,就把大查询分为小块分别进行。
2、加大回滚段或撤销段
3、用撤销段时增大UNDO_RETENTION参数值,该值为过期数据在撤销段中保留时间。
4、10g的话,配合第三点可在撤销表空间上启用撤销保留保证retention guarantee特性。
caoleione
2008-08-05
打赏
举报
回复
增加回滚段空间 在循环游标时 进行批量提交 不是1700万数据都要循环更新吧 尽可能减少更新范围
cosio
2008-08-05
打赏
举报
回复
[Quote=引用楼主 linzi 的帖子:]
各位高手,现在做的系统中有一个用户表,1700多万条记录,另有一个用户信息表,与用户表的ID对应,现在要根据用户表来插入用户信息表的内容,对用户表使用了一个游标,每循环一次,取得相应信息,写入到用户信息表中,用户信息表的字段比较多,每个循环里面的操作挺多,并且不能放到循环外面,现在的运行时间很久,并且经常会出现ORA-01555错误,这样的情况怎么解决?
[/Quote]
ORA-01555 snapshot too old: rollback segment number string with name "string" too small
Cause: Rollback records needed by a reader for consistent read are overwritten by other writers.
Action: If in Automatic Undo Management mode, increase the setting of UNDO_RETENTION. Otherwise, use larger rollback segments.
qfsb_p
2008-08-05
打赏
举报
回复
数据量如此庞大的表是不建议有太多字段的,否则处理起来很慢。
这样的场景除了在io上进行优化之外,主要的是程序设计上的优化,而程序的优化也需要根据你们自己的业务需求而来,比如
如果对于速度要求不高,而是要求稳定性的话,可以考虑每次先从用户表中取出若干条记录的主键存到一个队列中,然后针对
队列中的每条记录进行单独的处理,比如根据主键从用户表中读取,然后写入用户信息表。
当然如果能采用多线程编程,有一个线程不停的往队列中增加新的主键记录,而另一个或多个负责进行数据处理效果更好。
lws0472
2008-08-05
打赏
举报
回复
这样操作肯定需要很大的undo表空间,建议将程序多分几段运行,一次只处理表中的部分数据,并且每一部分处理完后就commit
Ora
cle出现超出打开
游标
最大数的
解决
方法
当程序在处理大量数据或者进行复杂操作时,可能会遇到“超出打开
游标
最大数”的
错误
,即
ORA
-01000异常。这个
错误
通常表明数据库当前打开的
游标
数量
超过了`open_cursors`参数所设定的最大值。 首先,我们需要理解为...
Ora
cle9i的init.
ora
参数中文说明
说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级的读取锁, 以防止在包含该查询的事务处理被提交...
(第87天)深入分析
ORA
-
01555
问题与
解决
方案
ORA
-
01555
与数据库破坏或者数据丢失没有关系,所以不用担心数据问题,这个报错...经过实战演示,如果再遇到
ORA
-
01555
问题时,相信大家可以得心应手的
解决
。开启 UNDO 表空间自动扩展;调整 undo_retention 参数;
ORA
-
01555
错误
详解
ORA
-
01555
错误
详解
ORA
-
01555
(快照过旧)问题让很多人感到十分头痛。最近我们的生产系统上也报出了
ORA
-
01555
错误
。就结合这次案例将
ORA
-1555问题作个案例分析,并浅析产生原因和各种
解决
办法。 如果要了解1555...
Ora
cle
错误
代码总结及
解决
方案
ora
-0
ORA
-00001:违反唯一约束条件(主键
错误
)
ORA
-00028:无法连接数据库进程
ORA
-00900:无效sql语句
ORA
-00904:字段名写错或是建表时最后一个字段有逗号
ORA
-00907:缺少右括号
ORA
-00911:无效字符
ORA
-00917:...
Oracle
17,136
社区成员
55,257
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章