특정시간에 나타나는 enq: RC - Result Cache: Contention 이벤트 0 1 1,705

by OraclePark [Oracle Tuning] result_cache tuning lock wait event [2017.09.04 15:31:32]


안녕하세요. 가입날부터 질문을 올리려니 죄송하지만, 활동하시는 분들의 고견을 듣고 싶어서 글을 올립니다.

현재 저희가 사용하는 DB는 Oracle 11gr2 버전을 사용하고 있습니다.

2달 전부터 간헐적으로 서버 로직에러가 발생하고 있습니다.(주로 하루 중 저녁 10시 ~ 11시 사이에 2건 정도)

처리 하는 로직은 대략 다음과 같습니다. (Session1, Session2로 표기)

Session 1 10:20:20  - ① 단일 행 Update 및 이력 테이블 Insert - Commit (Commit 처리 완료되지 않음)

Session 2 10:20:24  - ① Session 1에서 Update한 레코드 Select (Read Uncommitted)

                            ② Session 2 Update 하기 위한 데이터 생성 (①에서 Select한 레코드 기준)

                            ③ Framework API 호출 

                                 - Transaction Level Read Commited 로 ①에서 Select한 레코드 다시 Read)

                                 - Session 1 레코드가 아직 Commit 완료되지 않았기 때문에 대기 (10 여초 이상)        

                                 - Session 1 Commit 된 후 레코드 Read

                                 - ②에서 생성한 데이터가 ③의 데이터와 일치하지 않기 때문에 Error 발생

단일 행 Update 시간이 너무 오래 걸려서 DB 대기 Event를 확인해 보았더니  (10여초 정도, 평소는 한개 Transaction 처리시간이 3초 미만입니다.)

해당 시점에 (1시간 단위) enq: RC - Result Cache: Contention 대기 이벤트가 다수 발생 함을 확인 할 수 있었습니다.

(Event, Session Id, Module, Blocking Session 별로 Time Waited 집계했을 때 20초~30초 이상)

여기서 이상한 점은 저희쪽에서는 Result_Cache 힌트를 사용하지 않고 (사용 쿼리 및 Procedure 확인) Oracle의 Result Cache Mode도 Manual 로 되어 있다는 점입니다.

또 하나는 V$RESULT_CACHE_OBJECTS 를 조회했을 때 "SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) " 와 같은 형식의 Result 가 다수 존재하고 있습니다. (현재 시점 약 290건 중 Status Invalid 220건)

혹시 이와 비슷한 현상을 겪어 보신분들 계신가요? 있으시다면, 어떠한 데이터들을 확인 및 해결하셨나요? 또는 제가 어떤 부분을 확인을 해볼 필요가 있을까요?

간단한 팁이라도 알려주신다면, 정말 감사하겠습니다.

 

모두들 행복한 하루 되세요~

 

by bryancheon [2017.09.06 08:45:34]

저도 위와 같은 상황을 겪어보지는 못했지만 몇가지 기술해 봅니다.

Result Cache을 명시적으로 사용하는 환경이나 Hint가 없는 것으로 보이는 상태에서
세션이 Dynamic Sampling 판단을 시도하는 것 같습니다.
확인하신 Blocking Session 들이 대기하는 Blocking Objects 가
무엇인지(해당 테이블인지, 아니면 Dynamic 통계정보관련 Objects 인지) 궁금하내요.

DS_SVC : 다이나믹 통계정보 활동 관련 문장들로 추정.
dynamic_sampling(0) : Dynamic 통계정보를 사용하지 않는 Hint (값 : 0)

해당 현상을 테스트 장비에서 재현가능하다면 다음의 같이 수행해 보는 것은 어떨가요 ?
* Session1 과 Session2 처리로직의 시작 부분에 다음의 같이 세션 level 수행
1) PL/SQL 에서 수행한다면
execute immediate 'alter session set optimizer_dynamic_sampling=0';
2) sqlplus 에서 수행한다면
alter session set optimizer_dynamic_sampling=0
3) RC 대기가 발생하는 Select 또는 DML 문장에 Hint 을 넣을 수 있다면
select /*+ dynamic_sampling(0) */ ...
SELECT /*+ dynamic_sampling(<tab/alias name> 0) */ ...

자세한 분석이 필요하다면 Oracle 기술지원 도움을 받으심이...

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