현상
Tibero 내부적으로 수행되는 쿼리가 invalidate 되었음에도 *cache out 되지 않고 남아있는 현상으로 인해 ERROR_TOO_MANY_OPEN_CURSORS_USING_SAME_OBJECT(-12098) 에러코드가 발생하였습니다.
참고
cache out 이란? 데이터 블록이 버퍼 캐시(Buffer Cache)에서 제거되는 것을 의미합니다.
원인
1.
동일한 SQL문에 대하여 Physical Plan(이하 pp)를 반복 생성하여 오류가 발생하였습니다.
2.
shared pool에 올려둘 수 있는 최대치에 도달하여 오류가 발생하였습니다.
Tibero 정책 상, 동일한 sql문에 대하여 생성 가능한 pp 갯수의 최대치가 존재합니다. (기본값 32767, _SC_OBJ_PIN_COUNT_MAX : Shared Cursor (SC) 객체의 Pin 횟수 제한하는 파라미터 설정으로 변경 가능) 일반적으로는 한 번 생성한 pp는 pp cache에 올려서 재활용하고, 기존에 생성했던 pp가 invalid 상태가 되어 다른 pp를 생성하게 되더라도 shared pool의 용량이 부족하다고 판단될 때 invalid 상태의 pp를 cache out하기 때문에 최대치에 도달할 일이 없으나 dml과 truncate를 반복하여 sql문 하나에 대한 pp만 반복적으로 생성하는 경우, shared pool의 용량이 부족해지기 전에 pp 갯수 최대치에 도달하여 해당 오류가 발생할 수 있습니다.
해결
SQL> select count(*) from v$sql where sql_text like 'SELECT /*+ default_stat%';
SQL
복사
해당 쿼리 조회 값에 따라 해결 방법은 아래와 같이 2가지로 나뉩니다.
1. 값이 32,768을 넘지 않는 경우
_USE_LAZY_SC_OBJ_FREE=N
SQL
복사
위와 같이 _USE_LAZY_SC_OBJ_FREE=N 파라미터를 적용합니다.
참고
_USE_LAZY_SC_OBJ_FREE 는 Shared Cursor Object의 Lazy Free (지연 해제) 기능 사용 여부를 제어하는 파라미터입니다. Shared Cursor 객체(SC Object)를 즉시 제거하지 않고 일정 조건 하에 지연(free delay) 해제하도록 조정하여, 성능 및 경합을 완화합니다.
2. 값이 32,768을 넘는 경우
패치를 적용하여 해결합니다. (적용 패치: 134147)
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.