세션 커서 캐싱

{*}세션 커서?*


공유커서를 실행하기 위해 PGA로 인스턴스화 한 것을 의미하며, 쿼리 수행 후 커서를 닫게 되면 세션커서를 위해 할당 한 메모리 및 공유커서를 가르키던 포인터 또한 해제
{*}세션 커서 캐싱?*


같은 SQL을 재수행 할때 이전에 수행 했던 라이브러리 탐색을 다시 해야 하는 문제 점이 있으며, 한번 만 수행을 하게 되면 문제가 발생하지 않지만 여러번 같은 SQL을 실행시키는 경우 불필요한 부하를 줄수 있다.
이러한 세션 커서의 문제점을 해결하기 위해 오라클에서는 세션 커서 캐싱이라는 기능을 제공



SQL> ALTER SESSION SET SESSION_CACHED_CURSORS = 10;

세션이 변경되었습니다.

SQL> ALTER SYSTEM FLUSH SHARED_POOL;

시스템이 변경되었습니다.




SQL> SELECT empno, ename FROM emp WHERE empno = 7369;

     EMPNO ENAME
---------- ----------
      7369 SMITH

SQL> SELECT parse_calls
  2       , users_opening
  3      , users_executing
  4   FROM v$sql
  5       WHERE sql_text = 'SELECT empno, ename FROM emp WHERE empno = 7369';

PARSE_CALLS USERS_OPENING USERS_EXECUTING
----------- ------------- ---------------
          1             0               0



SQL> SELECT empno, ename FROM emp WHERE empno = 7369;

     EMPNO ENAME
---------- ----------
      7369 SMITH

SQL> SELECT empno, ename FROM emp WHERE empno = 7369;

     EMPNO ENAME
---------- ----------
      7369 SMITH



SQL> SELECT parse_calls
  2       , users_opening
  3      , users_executing
  4   FROM v$sql
  5       WHERE sql_text = 'SELECT empno, ename FROM emp WHERE empno = 7369';

PARSE_CALLS USERS_OPENING USERS_EXECUTING
----------- ------------- ---------------
          3             1               0	

  • 커서를 실행시키고 커서를 닫는 순간 현재 Parse Call 횟수가 3보다 크면 세션 커서 캐쉬로 옮기는 것을 알 수가 있다.
    PARSE_CALLS 컬럼이 3일때 USERS_OPENING 컬럼이 1로 변경 됨
  • 세션 커서의 정보가 세션 커서 캐쉬로 저장이 되면 다음 번에 해당 커서를 실행 시켰을 경우 SQL을 읽어 오는 속도를 감소시킬 수가 있다.
  • 세션 커서 또한 LRU알고리즘을 사용하여 사용이 적은 커서 부터 삭제가 된다.

SQL> SELECT a.name, b.value
  2  FROM v$statname a, v$mystat b
  3  WHERE a.name IN ('session cursor cache hits','parse count (total)')
  4  AND b.statistic# = a.statistic#;

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session cursor cache hits                                               556
parse count (total)                                                     653

SQL> ALTER SESSION SET SESSION_CACHED_CURSORS = 0;

세션이 변경되었습니다.

SQL> DECLARE
  2     i   NUMBER;
  3  BEGIN
  4     FOR i IN 1 .. 10000
  5     LOOP
  6        EXECUTE IMMEDIATE 'INSERT INTO t VALUES(' || MOD (i, 100) || ')'
  7     END LOOP;
  8  END;
  9  /

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> SELECT a.name, b.value
  2  FROM v$statname a, v$mystat b
  3  WHERE a.name IN ('session cursor cache hits','parse count (total)')
  4  AND b.statistic# = a.statistic#;

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session cursor cache hits                                               556
parse count (total)                                                   10772


SQL> ALTER SESSION SET SESSION_CACHED_CURSORS = 100;

세션이 변경되었습니다.

SQL> DECLARE
  2      i NUMBER;
  3      BEGIN
  4          FOR i IN 1 .. 10000
  5          LOOP
  6              EXECUTE IMMEDIATE 'INSERT INTO t VALUES(' || MOD(i,100) || ')';
  7          END LOOP;
  8      END;
  9  /

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> SELECT a.name, b.value
  2  FROM v$statname a, v$mystat b
  3  WHERE a.name IN ('session cursor cache hits','parse count (total)')
  4  AND b.statistic# = a.statistic#;

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
session cursor cache hits                                             10258
parse count (total)                                                   20781


-세션 커서 캐싱은 Parse Call을 줄여 주는 역할이 아니라 Parse Call 부하를 감소키는 역할을 한다.



SQL> select a.value "session cursor cache hits",
  2  b.value "total parse call count",
  3  round(a.value/b.value*100,2) "session cursor cache hits%"
  4  from v$sysstat a, v$sysstat b
  5  where a.name = 'session cursor cache hits'
  6  and b.name = 'parse count (total)';

session cursor cache hits total parse call count session cursor cache hits%
------------------------- ---------------------- --------------------------
                    22061                  28143                      78.39