오라클 성능 고도화 원리와 해법 I (2016년-2)
세션 커서 캐싱 0 0 3,782

by 구루비 커서 [2017.01.03]


07 세션 커서 캐싱

세션 커서 캐싱

쿼리를 수행한 후 커서를 닫으면 세션 커서를 위해 할당된 메모리와 포인터까지 해지된다.
이후 같은 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' 의 의미가 실제 커서가 열려 있음을 의미하는 것이 아니다. 커서는 닫힌 상태지만 공유 커서에 대한 참조를 유지하기 때문에 다 음수행 시 더 빨리 커서를 오픈 할 수 있다.

session cursor cache hits


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 부하를 감소시키는 기능으로 이해해야 한다.

"구루비 DB 스터디 모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 I " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3173

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

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