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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
27 | 5. V$SYSSTAT [1] | 토시리 | 2010.06.14 | 9851 |
26 | 1. 블록 단위 I/O | 토시리 | 2010.07.12 | 9381 |
» | 4. 커서 공유 | balto | 2010.06.28 | 9201 |
24 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.12 | 9172 |
23 | 2. User Call vs. Recursive Call | 토시리 | 2010.07.07 | 9050 |
22 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.04 | 8643 |
21 | 1. 트랜잭션 동시성 제어 | 실천하자 | 2010.05.31 | 8632 |
20 | 2. AutoTrace | 실천하자 | 2010.06.06 | 8599 |
19 | 3. 비관적 vs. 낙관적 동시성 제어 | 휘휘 | 2010.06.07 | 8210 |
18 | 9. Snapshot too old | balto | 2010.05.30 | 8103 |
17 | 11. End-To-End 성능관리 | 휘휘 | 2010.06.14 | 8095 |
16 | 7. Response Time Analysis 방법론과 OWI | balto | 2010.06.13 | 8067 |
15 | 10. 대기 이벤트 | balto | 2010.05.30 | 8012 |
14 | 8. I/O 효율화 원리 | 휘휘 | 2010.07.19 | 7743 |
13 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.12 | 7439 |
12 | 부록 | 휘휘 | 2010.07.19 | 7238 |
11 | 1. SQL과 옵티마이저 | 휘휘 | 2010.06.28 | 7218 |
10 | 12. 데이터베이스 성능 고도화 정석 해법 | 휘휘 | 2010.06.14 | 7153 |
9 | 4장. 라이브러리 캐시 최적화 원리 | 휘휘 | 2010.06.28 | 6916 |
8 | 2장. 트랜잭션과 Lock | 운영자 | 2010.06.01 | 6896 |