Oracle

게시글 보기
작성자 유건데이타 등록일 2015-06-17
제목 CURSOR_SHARING의 사용 ( V8.1.6 NEW FEATURE )
CURSOR_SHARING의 사용 ( V8.1.6 NEW FEATURE )
===========================================


Explanation
-----------

1. 용례

1) initSID.ora에 기술 : CURSOR_SHARING = { FORCE | EXACT }
2) Scope : Dynamic ( ALTER SESSION, ALTER SYSTEM )
3) Default Value : EXACT

2. 설명

다음과 같은 두 개의 SQL 문장은 sql area의 cursor를 공유하지
못한다.

SELECT ename, empno FROM emp where deptno = 10;
SELECT ename, empno FROM emp where deptno = 20;

-> 위 sql 문장에서 다른 부분은 모두 동일하나 binding variable을
사용하지 않고 각각 상수인 10, 20을 사용한다.

만약 두 가지 sql 문장이 cursor를 공유하도록 하기 위해서는
sql 문장을 다음과 같이 바꿀 수 있다.

SELECT ename, empno FROM emp where deptno = :department_no;

하지만 이와 같이 바꾸는 것이 여의치 않을 경우 init 파라미터 파일이나
ALTER SYSTEM, ALTER SESSION 등의 명령으로 CURSOR_SHARING 값을
FORCE로 지정하면 된다.

3. 고려사항

CURSOR_SHARING 값을 FORCE로 지정하기 위해서는 다음과 같은 2가지 사항을
고려하여야만 한다.

1) SQL area에서 값을 제외한 다른 부분이 모두 동일한 문장이 많이 있는지
2) library cache miss가 높아 response time이 늦는지

* DSS 시스템에서는 CURSOR_SHARING 값을 FORCE로 지정할 경우 결과를 예측
하기 어려우므로 권장하지 않는다. 또한 복잡한 query나 query rewrite,
stored outline을 사용할 경우에도 CURSOR_SHARING 값을 FORCE로 지정하는
것을 권장하지 않는다.


4. 성능 분석

환경 : Windows NT 4.0 ( Pentium 233MHz 1 CPU, 128M )
Oracle 8.1.6

시나리오 : 특정 table에 만 개의 row insert

1) Binding Variable을 사용하지 않고 CURSOR_SHARING 값이 EXACT인 경우

-> Total time elapsed : 80,496 msec.

2) Binding Variable을 사용하지 않고 CURSOR_SHARING 값이 FORCE인 경우

-> Total time elapsed : 61,699 msec.

3) Binding Variable을 사용할 경우

-> Total time elapsed : 21,561 msec.

위 결과에 따르면 동일한 sql 문장을 반복적으로 처리할 경우 binding
variable을 사용하는 것이 가장 속도가 빠른 것으로 나타났으며, binding
variable을 사용하지 않을 경우에도 CURSOR_SHARING 값이 FORCE일 경우
그렇지 않을 경우 약 23% 정도의 속도 개선 효과가 있음을 알 수 있다.


from otn
오라클 유지보수 유건데이타
Comment
등록된 코멘트가 없습니다.