commit이 끝난 테이블에 select문을 실행시에도 undo정보가 발생되나요? 0 3 1,847

by 시공 [Oracle Admin] [2018.01.10 18:23:53]


최종질문부터 먼저 간단히 말씀드리면

"DML뿐만이 아닌 select문을 실행할 때에도 undo정보를 만들고 나서 select문을 실행하나요?" 입니다.

 

undo_retention값을 초과하는 장시간의 select문을 던질때는 snapshot too old에러가 나게 됩니다.
원인을 검색해보면 쿼리가 시작된 시점의 이미지를 찾을수 없기 때문이라고 합니다.
생각해보면 당연합니다. 
500억개의 rows가 모두 apple이라는 값을 갖고 있는 테이블에 A세션이 select문을 실행중인데,
도중에 B세션이 apple을 banana로 update하고 commit해버린다면,
A세션은 select문을 던진 시점의 결과인 apple값을 undo정보로 부터 받아야 합니다.


이 때문에 select문을 실행할 때에도 undo정보를 만들고 난뒤에야 select문을 실행할꺼라 생각합니다.
근데 자료를 찾아봐도 그런 직접적인 설명이 없기에 확실한 확인차 질문드립니다.

(혹시 이에 대한 링크나 자료가 있다면 같이 부탁드리겠습니다!)
 

by 마농 [2018.01.11 09:32:18]

UNDO 의 정의 와 목적을 우선 이해해야 합니다.
UNDO 는 데이터 변경(Update)시 작업(Transaction)을 취소(Rollback)하기 위한 목적으로 사용됩니다.
당연히 Select 할 때 생길리가 없구요.
Select 할 때 다른 갱신작업에 사용된 undo 를 이용할 수는 있습니다.
조회 시작 이후에 조회가 완료되기전 갱신자료가 존재한다면?
갱신 이전 자료를 조회해야 합니다. (Consistans read : 읽기 일관성)
갱신 이전 자료를 조회하기 위해 UNDO 를 복사하여 사용하게 되는데 이를 CR COPY 라고 합니다.
 - CURRENT BLOCK : 카밋이 완료된 블럭
 - UNDO BLOCK : 커밋 이전 데이터 블럭
 - CR(Consistent read) 블록 : 조회시점(SCN)의 UNDO 블록 복사
http://wiki.gurubee.net/display/STUDY/Undo
http://wiki.gurubee.net/pages/viewpage.action?pageId=20250663


by 시공 [2018.01.14 17:39:29]

답변 감사드립니다 마농님! 근데 질문이 제대로 전달되지 않은것 같아서 다음 답변에 대해 한번 더 질문드립니다!
"조회 시작 이후에 조회가 완료되기전 갱신자료가 존재한다면? 갱신 이전 자료를 조회해야 합니다. (Consistans read : 읽기 일관성)
갱신 이전 자료를 조회하기 위해 UNDO 를 복사하여 사용하게 되는데 이를 CR COPY 라고 합니다."

여기서 갱신 이전 자료를 조회하기 위해 undo를 복사한다고 하셨는데요
이 카피해오는 undo의 생성 시점 때문에 질문드렸습니다.
너무나 당연히 DML실행시에는 undo가 생성된다는것은 당연히 알고 있습니다.
근데 제가 궁금한 경우는 commit후 undo_retention기간이 지나 undo정보가 없어진 시점을 말씀드린겁니다.

자세한 예를 들어보겠습니다.
SAMPLE 테이블에 commit이 실행된 후 시간이 한참지나서 이에 대한 undo정보나 트랜잭션이 남아있지 않습니다.
이러한 테이블에
A세션이 20분이 소요되는 select문을 던졌습니다. 그리고 16분이 지나고
B세션이 몇개 rows를 update한후에 commit하였습니다.
이 경우 A세션은 읽기 일관성을 유지하기 위해서 쿼리를 시작한 시점의 자료를 select해야 합니다.
그럼 여기서 A세션은 undo를 읽어와야 할텐데 미리 말씀드렸다시피 이미 commit후 시간이 지나서 UNDO에 대한 정보가 남아있지 않습니다. 이 경우 어떻게 읽기일관성을 유지하는지 궁금해서 질문드렸습니다!


by 마농 [2018.01.15 08:17:40]

A세션이 20분이 소요되는 select문을 던졌습니다. 그리고 16분이 지나고
B세션이 몇개 rows를 update한후에 commit하였습니다.
B세션이 update 할때 undo 가 생성되었겠지요.
A세션은 B세션이 생성한 undo 를 참조합니다.
만약 B세션이 생성한 undo 가 메모리에서 지워졌다면?
snapshot too old 가 발생되겠지요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입