티스토리 뷰

DB/Oracle

Snapshot too old(ORA-01555)

Tomining 2015. 3. 18. 17:20
원인)
 1. 데이터를 읽어 내려가다가 쿼리 SCN 이후에 변경된 블록을 만나 과거 시점으로 Rollback 한 CR(Consistant Read)이미지를 얻으려고 하는데, Undo 블록이 다른 트랜젝션에 의해 이미 재사용되 필요한 Undo 정보를 얻을 수 없는 경우
 2. 커밋된 트랜젝션 테이블 슬롯이 다른 트랜젝션에 의해 재사용되 커밋 정보를 확인할 수 없는 경우



Snapshot too old를 회피하는 방법

1. Undo 영역의 크기를 증가
2. 불필요하게 커밋을 자주 수행하지 않는다.
3. Fetch across commit 형태의 프로그램 작성을 피해 다른 방식으로 구현한다. ANSI 표준에 따르면 커밋 이전에 열려 있던 커서는 더는 Fetch하면 안된다.
4. 트랜잭션이 몰리는 시간대에 오래 걸리는 쿼리가 같이 수행되지 않도록 시간을 조정한다.
5. 큰 테이블을 일정 범위로 나눠 읽고 단계적으로 실행 할 수 있도록 코딩한다.
6. 오랜 시간에 걸쳐 같은 블록을 여러 번 방문하는 Nested Loop 형태의 조인문 또는 인덱스를 경유한 테이블 액세스를 수반하는 프로그램이 있는지 체크하고, 이를 회피할 수 있는 방법(조인 메소드 변경, Full Table Scan 등)을 찾는다.
7. 소트 부하를 감수하더라도 order by 등을 강제로 삽입해 소트연산이 발생하도록 한다.
8. 대량 업데이트 후에 곧바로 해당 테이블 또는 인덱스를 Full Scan 하도록 쿼리를 수행한다.

위 방법은 책이나 인터넷에서 쉽게 찾아볼 수 있다. 다만 위 방법이 왜 효과가 있는지는 정확히 잘 모르겠다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함