4. 커서 공유
2010.06.28 00:17
▣ 커서의 개념 -다음 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에 리소스를 할당해야하는데 이 때 ‘커서’라는 용어를 사용한다.
▣ 커서 공유
- 라이브러리 캐시의 공유 커서를 말한다.
- 라이브러리 캐시에 공유되 있는 커서의 수행 통계 보는 방법
(실험) 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) 조건절 값 비교(가장 문제되는 경우)
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
7 | 2. Cursor_Sharing | balto | 2010.07.17 | 10255 |
6 | 7. Result 캐시 | 휘휘 | 2010.07.19 | 12997 |
5 | 8. I/O 효율화 원리 | 휘휘 | 2010.07.19 | 7753 |
4 | 부록 | 휘휘 | 2010.07.19 | 7243 |
3 | 6. RAC 캐시 퓨전 | 토시리 | 2010.07.19 | 12637 |
2 | 3. Deterministic 함수 사용 시 주의사항 | 실천하자 | 2010.07.19 | 10607 |
1 | 진행기록 | 운영자 | 2011.08.23 | 6597 |