|
<실습>
- 라이브러리 캐시에 어떤 유형의 오브젝트들이 적재되는지를 보여준다. 1. 생성 후 Drop 하기 전까지 데이터베이스에 영구적으로 보관되는 오브젝트 정보 => 테이블 / 인덱스 / 클러스터 / 뷰 / 트리거 / 패키지 / 사용자 정의 함수 / 프로시저 등.. : 생성될때 부터 이름을 갖음 2. 실행시점에 생성돼서 인스턴스가 떠있는 동안에만 존재하는 일시적인 오브젝트 정보 => 커서 / Anonymous PL/SQL문 : 문장을 구성하는 전체 문자열 그대로가 이름 역활을 함 |
- Shared Pool도 DB 버퍼 캐시처럼 LRU 알고리즘에 의해 관리 된다.
=> 재사용 빈도가 낮은 SQL은 캐시에서 밀어냄으로써 새로운 SQL을 캐싱할 수 있도록 공간을 확보한다.
- 9i부터 Shared Pool을 여러 개 Sub Pool로 나누어 관리할 수 있게 되면서 래치도 7개 까지 사용할 수 있데 되었다.
- 라이브러리 캐시도 DB 버퍼 캐시처럼 해시구조로 관리 된다.
=> 패시 버킷에 LCO 핸들이 체인으로 연결돼 있고, 핸들을 통해 LCO 힙을 찾아가는 구조
=> DB 버퍼 캐시와 마찬가지로 해시 함수를 통해 리턴된 해시 값을 가지고 해시 버킷을 할당한다.
- Parent 커서 밑에 Child 커서가 연결되는 구조를 갖는다.
=> 커서를 공휴하지 못하고 별도로 생성해야 할 때 : 다중 Child 커서를 사용한다.
- 라이브러리 캐시 체인을 탐색하고 변경하려면 먼저 library cache래치를 획득해야 한다.
=> 이 때 발생하는 경합 - latch : library cache -> 소프트 파싱이 많이 발생해도 래치에 대한 경합이 증가한다.
- LCO를 보호하기 위해 라이브러리 캐시 Lock / 캐시 Pin을 사용한다.
- LCO에 접근할 때는 먼저 핸들에 대한 Lock을 획득 해야 한다.
- LCO의 실제 내용이 담긴 힙에서 정보를 읽거나 변경할 때는 Pin을 걸어두어야 한다.
- Shared Pool 래치 / library cache 래치 경합 : 소프트 / 하드 파싱을 동시에 심하게 일으킬 때 발생
- library cache lock / library cache pin 대기 이벤트 : DDL을 날릴 때 발생한다.
- 라이브러리 캐시 최적화를 위한 노력 3가지
1. 커서를 공유할 수 있는 형태로 SQL을 작성한다 -> 바인드 변수의 사용
2. 세션 커서 캐싱 기능을 이용 -> 라이브러리 캐시에서 SQL 찾는 비용을 줄인다.
3. 애플리케이션 커서 캐싱을 이용 -> Parse Call 발생량 줄임
04 커서 공유
(1) 커서란 ?
1. 공유 커서 : 라이브러리 캐시에 공유돼 있는 Shared SQL Area
2. 세션 커서 : Private SQL Area에 저장된 커서
3. 애플리케이션 커서 : 세션 커서를 가리키는 핸들
- 공유 커서 : SQL을 수행하면서 서버 프로세스는 해당 SQL이 라이브러리 캐시에 공유돼 있는지를 먼저 확인한다.
=> 라이브러리 캐시에 공유돼 있는 Shared SQL Area를 커서 라고 부른다.
- 세션 커서 : 라이브러리 캐시에 공유돼 있는 커서를 실행할 때는 우선 PGA영역에 메모리를 할당한다. 이를 Private SQL Area라 부른다.
=> Persistent Area / Runtime Area 로 나뉜다, 커서를 실행하는 데 필요한 정보들을 Private SQL Area에 담고, 공유 커서를 가리키는 포인터를 유지한다. / 커서의 상태 정보도 관리한다.
- 커서를 실행하기 위한 준비과정을 커서를 오픈한다 고 표현하고, PGA에 저장된 커서 정보를 또한 커서라고 부른다.
- 클래스를 인스턴스화 한것이 객체다
- 클래스는 디자인이고, 그것을 실체화한 것이 객체다.
- 클래스는 붕어빵을 만드는 틀이고, 객체는 그 틀로써 만들어낸 붕어빵이다.
- 커서를 오픈하면 라이브러리 캐시에 공유돼 있는 커서를 인스턴스화 함으로써 PGA에 커서를 위한 메모리 공간을 할당하고, 실제 데이터 추출을 시작할 수 있또록 준비작업을 한다.
- 애플리케이션 커서 : PGA에 있는 커서를 핸들링하려면 JAVA, VB, Pro *C, PL/SQL같은 클라이언트 애플리케이션에도 리소스를 할당해야 하는데 이 또한 커서라 한다.
<공유커서 / 세션커서 / 애플리케이션 커서 개념>
(2) 커서 공유
- 커서를 공유한다는 표현을 할 때 커서는 라이브러리 캐시의 공유 커서를 일컫는다.
=> 세션 커서 / 애플리케이션 커서는 공유가 불가능 하다.
- 라이브러리 캐시에 공유돼 있는 커서의 수행 통계를 v$sql을 통해 조회해 볼 수 있다.
<실습>
- parse_calls : 라이브러리 캐시에서 SQL 커서를 찾으려는 요청 횟수 - loads : 하드파싱을 거친 SQL 실행계획을 라이브러리 캐시에 적재한 횟수 - executions : SQL을 수행한 횟수 - invalidations : 커서가 무효화된 횟수, 커서가 참조하고 있는 오브젝트에 중요한 변화가 일어났음을 의미함
|
05 바인드 변수의 중요성
06 바인드 변수의 부작용과 해법