본문 바로가기

[ORACLE] ORA-01555 너무 이전 스냅샷 : 롤백 세그먼트

대용량 데이터를 처리하다 보면 다음과 같은 에러가 발생할 때가 있다.

해당 에러는 장시간 쿼리를 수행하는 동안 다른 트랜잭션에 의해 롤백 세그먼트에 변경이 일어나서 발생한다고 한다.

필자 역시 5분만에 잘 끝나던 쿼리가 갑자기 데이터가 변경되면서 5시간 동안 쿼리가 끝나지 않아 발생한 에러였다.

오라클 DB 툴을 이용하여 실행 계획을 볼 수 있으나 실제 운영 서버에서 실행한 오라클 플랜이 다르게 돌아갈 수도 있다고 한다. 결국 툴을 이용한 실행 계획만으로는 정확하게 쿼리 속도 저하의 원인을 못 잡을수도 있다.

해결방안

튜닝 요청 결과 각 조인이 일어나는 테이블 중 몇 개 테이블에 HINT를 추가하였다. /*+ INDEX(table명 index명) */ 을 통해 고정 인덱스를 태우도록 변경하였다. (실행 계획 중 몇 개 테이블이 PK 인덱스를 안타는 테이블이 있었다.)

더불어 불필요한 임시 데이터 수집의 개수를 줄였다.

INSERT 문에서는 PARARREL 과 APPEND 힌트를 사용해보고 nologging 명령어도 속도 처리에 좋은 효과를 낼 수 있다고 한다.

그렇게 튜닝을 하니 몇 시간동안 끝나지 않던 쿼리가 3분만에 처리되면서 위의 에러가 발생하지 않았다.

 

 

반응형
그리드형