행위

Ora-01555 snapshot too old

DB CAFE

thumb_up 추천메뉴 바로가기


1 ORA-01555 Snapshot too old 해결 방안[편집]

  1. ORA-01555 snapshot too old 에러는 쿼리 수행시간이 오래 걸려서 발생하는 undo 관련 에러
  2. 오라클에서 읽기 일관성을 보장을 위해 select 문장을 수행한 시점의 데이터를 client 로 반환 해야 하는데 쿼리가 수행되는 중간에 데이터가 변경 되어 commit 됨
  3. 오라클은 select 수행시점의 과거 데이터 스냅샷을 undo 에서 읽어들임
  4. 하지만 undo 의 공간은 overwite 되는 공간이므로 과거 데이터를 읽지 못할 때 스냅샷이 오래되었다는 해당 에러가 발생

2 = 해결방안1 - SQL 튜닝[편집]

  1. SQL 튜닝을 통한 쿼리 성능을 개선하는 방법 (베스트)

2.1 해결방안2 - 언두 테이블 사이즈 증가[편집]

  1. 적절한 Undo Size로 충분히 셋팅

2.2 해결방안3 - SCN_ASCENDING 힌트 사용[편집]

https://oracle-randolf.blogspot.com/2009/04/read-consistency-ora-01555-snapshot-too.html

  • table full scan 시 SCN_ASCENDING 힌트를 적용하는 방법
  • select 수행한 시점의 읽기일관성을 보장하지 않는 대신,

에러 발생하지 않고 쿼리가 정상적으로 수행

  • 작업 처리 절차
  1. scn_ascending 힌트를 사용하면 select 수행 이후에 SCN이 변경된 cr 블록이 아닌 curern블록을 그대로 읽음
  2. 하지만 dirty read 는 아니며 commit 된 데이터에 한해서 읽음
    1. 예를들어 select 시점에 SCN 100이라면, table을 full scan중에 scn이 200인 블록을 만났을 경우 undo에서 SCN 100인 블록을 찾아서 읽지않고 SCN 200인인 블록을 그대로 읽게 됨
  3. 즉, "읽기 일관성"을 유지할 수 없습니다.

단점) fetch 시작하기까지 시간이 좀 걸립니다.

    읽기 읽관성을 보장 하지 않음