问题描述
ORA-01555, 快照太旧, 这个错误应该是一个很经典的Oracle错误了, 我能在网上找到的原因: 是说查询太长时间, 有insert/update动作时就会容易造成这种错误. 然而我对其中的细节到现在也不明白, 还请iteye的大侠, 高手们指点.1. 发生ORA-01555, 会整体影响Oracle Server, 进而对其他session的响应也会变慢吗?2. 在一个session中的query语句执行后, 直到发生ORA-01555之前,是否有部分数据返回到client?3. ORA-01555对本session的影响是一个长时间的过程, 还是仅仅是一个瞬间错误的影响?也就是说: query过程中, 返回结果越来越慢, 直到发生ORA-01555, 还是在发生ORA-01555之前query的速度一直是正常的?4. 如果一处程序不断地在update/insert自己查询范围内的数据, 我想理论上更容易造成ORA-01555错误. 这种情况下: update/insert和query的session是分开好, 还是共用好?
解决方案
1. 发生ORA-01555, 会整体影响Oracle Server, 进而对其他session的响应也会变慢吗? 答:长查询需要耗费较多的内存,如果内存不够大,会影响到其他session,使其相应较慢!当然undo数据的回收和使用也会在一定程度下影响性能。2. 在一个session中的query语句执行后, 直到发生ORA-01555之前,是否有部分数据返回到client? 答:有部分数据返回3. ORA-01555对本session的影响是一个长时间的过程, 还是仅仅是一个瞬间错误的影响?也就是说: query过程中, 返回结果越来越慢, 直到发生ORA-01555, 还是在发生ORA-01555之前query的速度一直是正常的? 答:01555影响的是瞬间的过程,当undo数据不存在的时候且查询需要用到该undo数据的时候立即发生。其他请参见解答1。4. 如果一处程序不断地在update/insert自己查询范围内的数据, 我想理论上更容易造成ORA-01555错误.这种情况下: update/insert和query的session是分开好, 还是共用好? 答:容易造成01555是undo表空间设置不合理造成的,可以通过增大undo表空间大小,设置undo_guarantee,undo_retention来减少发生01555的次数