"커서 Cursor"의 두 판 사이의 차이
DB CAFE
(→라이브러리 캐시에 저장된 커서 조회) |
(→라이브러리 캐시에 저장된 커서 조회) |
||
18번째 줄: | 18번째 줄: | ||
:# 부모커서 = sql_id 컬럼 | :# 부모커서 = sql_id 컬럼 | ||
:# 자식커서 = child_number 컬럼 | :# 자식커서 = child_number 컬럼 | ||
+ | |||
{{알림 | {{알림 | ||
|내용=하드파싱을 피해야하는 이유 = 오라클이 공유가능한 커서(shared pool) 를 라이브러리 캐시에 저장하는 이유 | |내용=하드파싱을 피해야하는 이유 = 오라클이 공유가능한 커서(shared pool) 를 라이브러리 캐시에 저장하는 이유 | ||
24번째 줄: | 25번째 줄: | ||
# shared pool은 모든 세션이 공유하기 때문에 메모리 할당시 반드시 래치(11g 부터는 뮤텍스)가 발생되는 직렬화 과정을 거쳐야함. | # shared pool은 모든 세션이 공유하기 때문에 메모리 할당시 반드시 래치(11g 부터는 뮤텍스)가 발생되는 직렬화 과정을 거쳐야함. | ||
}} | }} | ||
+ | ==== 공유 가능한 커서 조건 ==== | ||
+ | # 일반적으로 SQL 구문의 텍스트가 완전히 동일하다면 여러 SQL 구문이 동일한 부모 커서를 공유함 | ||
+ | # 예외적으로 커서쉐어링 기능을 활성화 하면 SQL구문의 리터럴 값이 자동으로 바인드 변수로 치환되어 부모커서에 저장됨 | ||
+ | 예제 1) TEXT가 다른 4건의 sql | ||
+ | <source lang=sql> | ||
+ | SELECT * FROM t WHERE n = 1234; | ||
+ | select * from t where n = 1234; | ||
+ | SELECT * FROM t WHERE n=1234; | ||
+ | SELECT * FROM t WHERE n = 1234; | ||
+ | </source> | ||
+ | * 조회결과 3건 조회됨 | ||
+ | <source lang=sql> | ||
+ | select sql_id,sql_text,executions | ||
+ | from v$sqlaere | ||
+ | where sql_text like '%1234; | ||
+ | |||
+ | SQL_ID SQL_TEXT EXECUTIONS | ||
+ | ------------- ------------------------------ ---------- | ||
+ | 2254m1487jg50 select * from t where n = 1234 2 | ||
+ | g93jtp6r34124 SELECT * FROM t WHERE n = 1234 1 | ||
+ | ekekeq18ewqkr SELECT * FROM t WHERE n=1234 1 | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | |||
[[Category:oracle]] | [[Category:oracle]] |
2024년 1월 19일 (금) 17:26 판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
- A cursor is a name or handle to a specific private SQL area.
- As shown in Figure 14-5, you can think of a cursor as a pointer on the client side and as a state on the server side.
- Because cursors are closely associated with private SQL areas, the terms are sometimes used interchangeably.
- 커서는 특정 개인(private) SQL 영역에 대한 이름 또는 핸들입니다.
- 핸들은 프로그램이 리소스에 액세스 할수 있도록 만들어 주는 메모리 구조
- 핸들은 클라이언트 메모리에 위치 하고 서버 프로세스에 할당된 메모리구조(SGA 내부의 라이브러리 캐시)를 참조
- 그림에서 볼 수 있듯이 커서는 클라이언트 측의 포인터와 서버 측의 상태로 생각할 수 있습니다.
- 커서는 서버측 개인용(private) SQL 영역과 밀접하게 연관되어 있기 때문에 이 용어는 때때로 같은 의미로 사용됩니다.
- 서버측 개인용 SQL영역에는 바인드 변수값과 쿼리 수행 상태 정보가 저장
- 서버측 개인용 SQL영역을 저장하는데 사용하는 세션 메모리를 UGA(User Global Area)라고 한다.
1 라이브러리 캐시에 저장된 커서 조회[편집]
- V$SQLAREA
- V$SQL
- 부모커서 = sql_id 컬럼
- 자식커서 = child_number 컬럼
assignment 하드파싱을 피해야하는 이유 = 오라클이 공유가능한 커서(shared pool) 를 라이브러리 캐시에 저장하는 이유
- 실행 계획 생성작업은 CPU 부하가 많이 발생되는 작업
- 라이브러리 캐시에 저장되는 부모/자식 커서를 위해 shared pool 메모리가 소모됨
- shared pool은 모든 세션이 공유하기 때문에 메모리 할당시 반드시 래치(11g 부터는 뮤텍스)가 발생되는 직렬화 과정을 거쳐야함.
1.1 공유 가능한 커서 조건[편집]
- 일반적으로 SQL 구문의 텍스트가 완전히 동일하다면 여러 SQL 구문이 동일한 부모 커서를 공유함
- 예외적으로 커서쉐어링 기능을 활성화 하면 SQL구문의 리터럴 값이 자동으로 바인드 변수로 치환되어 부모커서에 저장됨
예제 1) TEXT가 다른 4건의 sql
SELECT * FROM t WHERE n = 1234;
select * from t where n = 1234;
SELECT * FROM t WHERE n=1234;
SELECT * FROM t WHERE n = 1234;
- 조회결과 3건 조회됨
select sql_id,sql_text,executions
from v$sqlaere
where sql_text like '%1234;
SQL_ID SQL_TEXT EXECUTIONS
------------- ------------------------------ ----------
2254m1487jg50 select * from t where n = 1234 2
g93jtp6r34124 SELECT * FROM t WHERE n = 1234 1
ekekeq18ewqkr SELECT * FROM t WHERE n=1234 1