2013년 8월 14일 수요일

[오라클자바community강좌]오라클 cursor sgaring parameter

cursor sgaring parameter 예제 입니다. 참고하세요~

CURSOT_SHARING 파라미터


 
구로디지털 오엔제이프로그래밍실무교육센터
www.onjprogramming.co.kr
 
 
 
비슷한 조건 문을 가지는 문장에 대해 SQL문을 공유하기 위해서는 이전 강좌 처럼 바인드 변수를 이용 할 수 있습니다이전강좌에서 상수 값을 다르게 주게 되는 경우 서로 다른 SQL로 인식을 하여 하드 파싱(처음 보는 SQL문으로 인식하여 일일이 파싱)을 한다고 하였습니다.

 Oracle 8.1.6
에서 소개된 Cursor_Sharing 변수는 각각의 문장들에 대해 bind 변수로 처리하지 않게 되더라도 내부적으로 바인드 변수로 처리하여 각각의 Cursor에 대해 공유가 가능 하도록 했습니다실제 이 기능은 Bind 변수를 쓰는 것 보다는 빠르지 않지만 Literal SQL문을 이용하는 것보다 20~30% 성능 향상이 있는 것으로 검증 되었습니다.
 
1. CURSOR_SHARING = EXACT
 
SQL문장이 모두 동일해야만 Soft Parsing이 가능 합니다.(재사용 한다는 이야깁니다.) Where절의 상수까지도 같아야 합니다.
 
다음예문을 참고 하세요~
SQL>conn / as sysdba
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
SQL> alter session set cursor_sharing = exact;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 
 SQL                                        COUNT(*)    총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = 10         1            1
select dname from dept where deptno = 40         1            1
 
파싱을 2번한 것을 알 수 있습니다
 
 
2. CURSOR_SHARING = SIMILAR
 
SQL문은 동일 해야 하며 조건에 정의된 바인드 변수의 값이 다르더라도 하나의 SQL문으로 간주하여 Soft Parsing 합니다이 값은 결국 다른 상수 값을 사용하더라도 하나의 SQL문으로 인식합니다, 3번의 경우(FORCE)와 같은 결과를 나타냅니다.
 
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
SQL> alter session set cursor_sharing = similar;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 SQL                               COUNT(*)          총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = :"         1            2
 
파싱이 한번만 일어남을 알수 있다
 
 
 
3. CURSOR_SHARING = FORCE
 
WHERE 조건절에 정의된 상수가 다르더라도 Soft Parsiing을 합니다.
 
SQL> alter system flush shared_pool;
 
시스템이 변경되었습니다.
 
SQL> conn scott/tiger
연결되었습니다.
 
SQL> alter session set cursor_sharing = force;
 
세션이 변경되었습니다.
 
SQL> select dname from dept where deptno = 10;
 
DNAME
--------------
ACCOUNTING
 
SQL> select dname from dept where deptno = 40;
 
DNAME
--------------
OPERATIONS
 
SQL> conn / as sysdba
연결되었습니다.
 
SQL> select substr(sql_text,1,40) "SQL", count(*),
  2     sum(executions) "총 실행 횟수"
  3  from v$sqlarea
  4  where sql_text like '%dept%'
  5  group by substr(sql_text,1,40)
  6  having count(*) > 0
  7  order by 2;
 
 SQL                               COUNT(*)          총 실행 횟수
---------- --------------------------------------------------
select dname from dept where deptno = :"         1            2
 

댓글 없음:

댓글 쓰기