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 | 8. 애플리케이션 커서 캐싱 | 토시리 | 2010.06.29 | 6612 |
26 | 9. Static vs. Dynamic SQL [1] | balto | 2010.07.04 | 18347 |
25 | 10. Dynamic SQL 사용 기준 | balto | 2010.07.04 | 8643 |
24 | 11. Static SQL 구현을 위한 기법들 | 실천하자 | 2010.07.05 | 12086 |
23 | 4. Array Processing 활용 | 휘휘 | 2010.07.05 | 18252 |
22 | 1. Call 통계 | 실천하자 | 2010.07.05 | 10446 |
21 | 5. Fetch Call 최소화 | 휘휘 | 2010.07.05 | 16851 |
20 | 5장. 데이터베이스 Call 최소화 원리 | 휘휘 | 2010.07.05 | 6103 |
19 | 2. User Call vs. Recursive Call | 토시리 | 2010.07.07 | 9050 |
18 | 3. 데이터베이스 Call이 성능에 미치는 영향 | 토시리 | 2010.07.07 | 11667 |
17 | 6장. I/O 효율화 원리 | 휘휘 | 2010.07.08 | 6404 |
16 | 4. Prefetch | balto | 2010.07.10 | 28443 |
15 | 5. Direct Path I/O | balto | 2010.07.10 | 12192 |
14 | 8. PL/SQL 함수 호출 부하 해소 방안 | 토시리 | 2010.07.11 | 14031 |
13 | 6. 페이지 처리의 중요성 | 실천하자 | 2010.07.11 | 6820 |
12 | 2. Memory vs. Disk I/O | 휘휘 | 2010.07.12 | 7439 |
11 | 3. Single Block vs. Multiblock I/O | 휘휘 | 2010.07.12 | 9172 |
10 | 7. PL/SQL 함수의 특징과 성능 부하 | 실천하자 | 2010.07.12 | 12607 |
9 | 1. 블록 단위 I/O | 토시리 | 2010.07.12 | 9381 |
8 | 1. Library Cache Lock | balto | 2010.07.17 | 12803 |