ORACLE/PARAMETER2008. 6. 10. 23:06
반응형
[SGA튜닝]Cursor Sharing Parameter
Cursor Sharing Parameter

비슷한 조건 문을 가지는 문장에 대해 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

파싱이 한번만 일어남을 알수 있다…
반응형

'ORACLE > PARAMETER' 카테고리의 다른 글

parameter SESSION_CACHED_CURSORS  (0) 2009.12.10
ORACLE 9i Parameter 설명  (0) 2007.02.10
Posted by [PineTree]