상기 SQL이 약 Duration=XXXXXsec초 동안 수행되다가, snapshot too olde error로 해당 프로세스가 끝난겁니다. 이것은, undo와 관련된 것인데 XXXXX초 전의 데이터를 읽어야 하는데, 그 이후에 다른 프로그램에 의해 어떤 데이터가 변경되고, 변경된 이미지는 UNDO에 저장되었는데, 이 다른 프로그램이 commit을 하고, 이 undo를 다른 프로그램이 재사용 해버리면, 상기 SQL은... 12134초 전의 데이터를 읽지 못함니다... 그러므로 에러가 나죠.
A : 상기 SQL을 수행하는 것.
B : A가 읽을 데이터를 변경하는것,
C : B가 사용한 undo를 재사용하는 것.
시간 ------------------------------>
A Select시작 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|| Error
B Data변경 ~~~~~~~~ Commit
undo 1번 사용. ------------ undo1번은 재사용 가능C undo1번 재사용.
해결방법은
- 상기 SQL을 tuning : 12000초면.. 3시간이 넘게 도는 SQL입니다. 충분히 튜닝 가능함.
- undo tablespace 증설 : undo 재사용확율을 줄여줍니다.
- undo 관리를 개런티모드로..
- 기타 여러가지 방법 있음... undo_retention 변경..등..
하지만 가장 좋은 것은 상기 SQL 튜닝하세요...
어려운 문제는 '오라클 문제해결' 클럽으로 오세요