ORA-01555错误浅析(3)
解决1555错误的方法
现在,我们已经知道了1555错误产生的原因。那么,就可以总结出以下方法来解决1555错误问题:
1、扩大回滚段
因为回滚段是循环使用的,如果回滚段足够大,那么那些被提交的数据信息就能保存足够长的时间是那些大事务完成一致性读取。
2、增加undo_retention时间
在undo_retention规定的时间内,任何其他事务都不能覆盖这些数据。
3、优化相关查询语句,减少一致性读。
减少查询语句的一致性读,就降低读取不到回滚段数据的风险。这一点非常重要!
4、减少不必要的事务提交
提交的事务越少,产生的回滚段信息就越少。
5、对大事务指定回滚段
通过以下语句可以指定事务的回滚段:
SET TRANSACTION USE ROLLBACK SEGMENT rollback_segment;
给大事务指定回滚段,即降低大事务回滚信息覆盖其他事务的回滚信息的几率,又降低了他自身的回滚信息被覆盖的几率。大事务的存在,往往是1555错误产生的诱因。
6、使用游标时尽量使用显式游标,并且只在需要的时候打开游标,同时将所有可以在游标外做的操作从游标循环中拿出。
当游标打开时,查询就开始了,直到游标关闭。减少游标的打开时间,就减少了1555错误发生的几率。
下面例子中,第一段代码发生1555错误的几率就大于第二段的:
差的:
declare
cursor cl is select b from demo.t_multiver;
v_b number;
begin
open cl;
--do some thing without relation to the cursor.
fetch cl into v_b;
while cl%found loop
--do other things without relation to the cursor.
... ...
fetch cl into v_b;
end loop;
close cl;
commit;
END;
好的:
declare
cursor cl is select * from demo.t_multiver;
begin
--do some thing without relation to the cursor.
--do other things without relation to the cursor.
open cl;
fetch cl into v_b;
hile cl%found loop
... ...
fetch cl into v_b;
end loop;
close cl;
commit;
END;
7、使用回滚表空间自动管理
回滚表空间自动管理是9i后的特性。他由Oracle自动管理回滚段的创建和回收。尽管有人认为这一特性是以后牺牲性能为代价的,或者有其他缺点而不建议使用。但我认为,这确实是Oracle一个很好的特性,特别是OLTP环境下应该使用它。并且10g中,这一特性大大增强了。
而在大型的数据仓库或者报表系统中,会有一些很大的查询作业存在,这时可以考虑使用手动管理,为某些大作业创建单独的回滚段。
以上总结了解决1555错误的各种办法,具体采用哪种方式,就需要根据错误产生的实际情况来决定了。