메뉴 건너뛰기

bysql.net

4. 커서 공유

2010.06.28 00:17

balto 조회 수:9197

커서의 개념 -다음 3가지를 말한다.

(1) 공유 커서(shared cursor) : 라이브러리 캐시에 공유되어 있는 Shared SQL Area

- JAVA, VB, Pro*C, PL/SQL에서 SQL을 실행하면 라이브러리 캐시에 SQL을 만들어 공유한다. 라이브러리 캐시에 공유된 Shared SQL Area를 ‘커서’라고 한다.

(2) 세션 커서(session cursor) : Private SQL Area에 저장된 커서

- 라이브러리 캐시에 공유된 커서를 실행할 때는 PGA 영역에 메모리 할당(Private SQL Area=Persistent Area+Runtime Area). PGA에 저장된 커서 정보를 ‘커서’라고 부른다.

- 라이브러리에 공유된 커서는 클래스상태이고, new Cursor()을 실행하면 PGA에 인스턴수가 생긴다.

(3) 애플리케이션 커서(application cursor) : 세션 커서를 가리키는 핸들

- PGA에 있는 커서를 핸들링하려면 JAVA, VB, Pro*C, PL/SQL에 리소스를 할당해야하는데 이 때 ‘커서’라는 용어를 사용한다.

fig4-7.jpg



커서 공유

- 라이브러리 캐시의 공유 커서를 말한다.

- 라이브러리 캐시에 공유되 있는 커서의 수행 통계 보는 방법

(실험) v$sql - 같은 SQL 문을 3번 실행하면 parse_call이 3번으로 증가(p260 참고)

SQL_ID

PARSE_CALLS

(요청 횟수)

LOADS(하드 파싱 후 적재 횟수)

EXECUTIONS

(SQL 실행 횟수)

INVALIDATIONS(커서가 무효화된 횟수)

RELOADS

f4rftk2rh90dv

3

1

3

0

0

- 다른 세션에서 같은 SQL 문을 실행하면 커서재사용(PARSE_CALLS=PARSE_CALLS+1)

- 커서의 킷값은 sql 문 텍스트 그 자체이므로 공백만 추가되도 다른 sql 문으로 인식한다.

Child 커서를 공유하지 못하는 경우

- SQL 문이 동일해도 별도의 SQL 커서를 생성해야할 경우도 있다.

예) 테이블 이름은 같지만 다른 스키마일 경우

- SQL 마다 1개의 부모 커서를 갖고, 기본적으로 1개의 자식커서를 갖는다.

- SQL 하나당 여러개의 child 커서를 갖는 것은 바람직하지 않다.

예) 고객사 마다 별도의 사용자 계정을 갖는 경우 같은 sql 문을 작성하면 child 수 증가.

- 하나의 sql 문장이 여러 개의 sql 커서를 갖는 이유

(1) 오브젝트 이름이 같지만 실제로는 다른 오브젝트일 경우

(2) 참조 오브젝트가 무효가 되었지만 아직 기존 세션이 사용중일 때

(3) 옵티마이저 관련 파라메터가 다를 경우

(4) 입력된 바인드 값의 길이가 다를 때

(5) NLS 파라메터를 다르게 설정했을 때

(6) SQL 트레이스를 활성화 했을 때

Parent 커서를 공유하지 못하는 경우 : SQL 문이 의미는 같지만 킷값이 다른 경우

(1) SQL 문에 공백문자 또는 줄바꿈이 있을 때

(2) 대소문자

(3) 테이블 소유자 명시

(4) 주석

(5) 옵티마이저 힌트

(6) 조건절 값 비교(가장 문제되는 경우)