4. 커서 공유
2010.06.27 15: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
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
47 |
2. 트랜잭션 수준 읽기 일관성
![]() | 휘휘 | 2010.06.06 | 20213 |
46 | 3. 비관적 vs. 낙관적 동시성 제어 | 휘휘 | 2010.06.06 | 8329 |
45 | 4. 동시성 구현 사례 | 토시리 | 2010.06.06 | 11079 |
44 |
5. 오라클 Lock
![]() | 휘휘 | 2010.06.06 | 26512 |
43 |
7. Response Time Analysis 방법론과 OWI
![]() | balto | 2010.06.13 | 8202 |
42 | 8. Statspack / AWR | balto | 2010.06.13 | 12910 |
41 | 9. ASH(Active Session History) | 실천하자 | 2010.06.13 | 15731 |
40 | 11. End-To-End 성능관리 | 휘휘 | 2010.06.13 | 8248 |
39 |
12. 데이터베이스 성능 고도화 정석 해법
![]() | 휘휘 | 2010.06.13 | 7248 |
38 |
5. V$SYSSTAT
[1] ![]() | 토시리 | 2010.06.13 | 9977 |
37 | 10. V$SQL | 실천하자 | 2010.06.13 | 12803 |
36 | 6. V$SYSTEM_EVENT | 토시리 | 2010.06.14 | 6641 |
35 |
3. 라이브러리 캐시 구조
![]() | balto | 2010.06.27 | 9957 |
» |
4. 커서 공유
![]() | balto | 2010.06.27 | 9324 |
33 |
1. SQL과 옵티마이저
![]() | 휘휘 | 2010.06.27 | 7326 |
32 |
2. SQL 처리과정
![]() | 휘휘 | 2010.06.27 | 20928 |
31 | 4장. 라이브러리 캐시 최적화 원리 | 휘휘 | 2010.06.27 | 7032 |
30 | 5. 바인드 변수의 중요성 | 실천하자 | 2010.06.27 | 11862 |
29 |
6. 바인드 변수의 부작용과 해법
![]() | 실천하자 | 2010.06.27 | 14868 |
28 |
7. 세션 커서 캐싱
![]() | 토시리 | 2010.06.29 | 10711 |