쿼리를 수행한 후 커서를 닫으면 세션 커서를 위해 할당된 메모리와 포인터까지 해지된다.
이후 같은 SQL을 수행하면 커서를 오픈하기 위한 라이브러리 캐쉬 탐색작업을 다시해야한다. 따라서 오라클에서는 이 작업에 따른 부하를 최소화 하기 위해 '세션 커서 캐싱(Session Cursor Caching)' 기능을 제공한다
SQL문을 파싱해서 구문을 분석하고 라이브러리 캐시에서 커서를 찾는 과정에서 소모되는 CPU 사용량을 줄일 수 있음은 물론, 소프트 파싱 과정에 발생하는 래치 요청 횟수를 감소시키는 효과를 가져온다.
세션 커서 캐시 내에서도 LRU(Least Recently Used) 알고리즘을 시용.
SQL> SELECT SESSION_CACHED_CURSORS FROM DBA_CPOOL_INFO
SESSION_CACHED_CURSORS
20
SQL> alter session set session cached cursors 10;
SQL> alter system f1ush shared poo1;
SQL> select * from emp where empno = 7788;
SQL> se1ect parse calls, users opening, users executing from v$sq1 where sql_text = select * from emp where empno 7788 ' ;
PARSE CALLS USERS OPENING USERS EXECUTING
l 0 0
SQL> select * from emp where empno = 7788;
SQL> se1ect parse calls, users opening, users executing from v$sq1 where sql_text = select * from emp where empno 7788 ' ;
PARSE CALLS USERS OPENING USERS EXECUTING
2 0 0
SQL> select * from emp where empno = 7788;
SQL> se1ect parse calls, users opening, users executing from v$sq1 where sql_text = select * from emp where empno 7788 ' ;
PARSE CALLS USERS OPENING USERS EXECUTING
3 1 0
users_opemng에서 'open' 의 의미가 실제 커서가 열려 있음을 의미하는 것이 아니다. 커서는 닫힌 상태지만 공유 커서에 대한 참조를 유지하기 때문에 다 음수행 시 더 빨리 커서를 오픈 할 수 있다.
SQL> create table t ( x number ) ;
SQL> select a.name, b.value
from v$statname a, v$mystat b
where a.name in ('session cursor cache hits','parse count (total)')
and b.statistic#=a.statistic# ;
NAME VALUE
session cursor cache hits 1228
parse count (total) 175
SQL> alter session set session cached cursors 0;
SQL> declare
i number;
begin
for i in 1 . . 10000
loop
execute immediate 'insert into t values(' || mod(i,100) ||')';
end loop ;
commit;
end;
SQL> select a.name, b.value
from v$statname a, v$mystat b
where a.name in ('session cursor cache hits','parse count (total)')
and b.statistic#=a.statistic# ;
NAME VALUE
session cursor cache hits 1228
parse count (total) 10763
SQL> alter session set session cached cursors 100;
SQL> declare
i number;
begin
for i in 1 . . 10000
loop
execute immediate 'insert into t values(' || mod(i,100) ||')';
end loop ;
commit;
end;
SQL> select a.name, b.value
from v$statname a, v$mystat b
where a.name in ('session cursor cache hits','parse count (total)')
and b.statistic#=a.statistic# ;
NAME VALUE
session cursor cache hits 10930
parse count (total) 20774
session cached cursors 파라미터를 100으로 설정시
Insert문을 10,000 수행하는 동안 session cursor cache hits, Parse Call 도 10,000번 가량 증가함.
커서를 세션 커서에 캐싱한다고 Parse Call까지 줄지는 않는 것을 알 수 있다.
세션 커서 캐싱 기능은 Parse Call을 대체하기보다 Parse Call 부하를 감소시키는 기능으로 이해해야 한다.