{*}세션 커서?*
공유커서를 실행하기 위해 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
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