[오라클] Shared pool 개요
Shared pool
SGA의 구성 요소. 파싱을 수행하는 부분이다. 소프트 파싱을 유도하고, 하드 파싱 시 적은 자원 사용을 하기 위한 구성 요소이다. 또한 파라미터 정보, 실행된 SQL, SQL 분석/실행 정보, 오브젝트 정보를 저장하는 메모리 영역이다.
파싱이란:
유저 프로세스에서 요청한 SQL을 수행하기 전 수행 가능한 SQL인지 검증/분석하는 단계
파싱의 종류:
소프트 파싱:
동일한 SQL 수행된 적이 있음을 검색을 통해 확인하고, 해당 SQL 파싱 정보를 재사용
하드 파싱:
1. 기존에 동일한 SQL이 수행된 적이 없거나,
2. 수행된 적 있으나 메모리 부족으로 버려진 SQL
이 두 가지 경우 다시 파싱을 수행하는 것을 가리킨다.
아래 그림은 공유 풀의 전체 구성 요소이다.
공유 풀의 라이브러리 캐시에서 해시 테이블, LRU 리스트를 사용한다.
해시 테이블:
해시 테이블은 메모리 크기 내에서 지금까지 수행된 모든 SQL을 저장한다. 새로운 SQL이 수행될 때 해시 테이블에서 동일한 SQL을 검색한다. 동일한 SQL이 존재할 경우 소프트 파싱을 수행한다.
LRU 리스트:
메모리 공간은 한정적이기 때문에, LRU 리스트 기법으로 최근 가장 적게 사용된 SQL을 메모리에서 삭제, 메모리 사용 효율을 높인다.
또한 공유 풀은 고정 영역 (Permanent area), 동적 영역 (Dynamic area), 예약된 영역 (Reserved area)로 구분된다.
고정 영역:
SGA 관리 메커니즘, 오라클 파라미터 정보가 저장된 영역. 크기를 확인하는 방법은 SQL> SHOW SGA 이다. 이 중 Fixed Size가 고정 영역의 크기에 해당한다. 이 크기는 파라미터 설정값을 고려하여 자동으로 할당되어 사용자가 지정할 수 없다.
동적 영역:
라이브러리 캐시 + 데이터 딕셔너리 캐시로 구성.
예약된 영역:
동적 메모리 할당을 위한 공간. 파싱 공간이 많이 필요한 SQL 파싱에 사용된다.
동적 영역의 구성 요소 두 가지
라이브러리 캐시:
유저가 실행한 SQL, 오라클이 내부적으로 사용하는 SQL (Recursive SQL), SQL에 대한 분석 정보 (Parse tree), 실행 계획이 저장된다.
데이터 딕셔너리 캐시:
테이블, 인덱스, 함수, 트리거같은 오브젝트의 정보와 권한이 저장된다. 또한 시스템 테이블스페이스의 모든 딕셔너리 정보도 이곳에 저장된다.
파싱 과정:
1. 문장 확인 (Syntax check)
2. 시맨틱 확인 (Database resolution)
3. 검색
4. 최적화 (Optimazation)
5. TM락
1. 문장확인:
SQL 문에 문법 오류가 있는지 확인한다.
2. 시맨틱 확인:
해당 SQL의 참조 테이블, 컬럼이 존재하는지, 해당 작업 수행 권한이 있는지 확인한다. 이때 데이터 딕셔너리 테이블을 통해 일련의 확인 작업을 한다. 필요한 테이블이 없을 경우 시스템 테이블스페이스로부터 로우 단위로 데이터 딕셔너리 캐시에 정보를 캐싱한다.
3. 검색:
공유 커서 (Shared cursor) 는 수행한 SQL에 대한 정보를 가지고 있고 동일한 공유 커서가 있으면 소프트 파싱이 가능한 구조이다. 이것은 공유 풀의 해시 테이블에서 SQL에 대한 오브젝트 핸들을 의미한다.
해시 버킷은 해시 함수 수행 시 리턴 대상 후보 값이다. 예를 들면 동일 SQL은 동일 ASCII코드값을 가지는 경우가 있다.
3-1. 파싱의 '검색'단계 상세 순서는, 먼저 클라이언트에서 SQL을 서버 프로세스로 전달한다. 해당 SQL을 ASCII 값으로 전환하여 해시 함수를 수행한다.
3-2. 해시 함수 실행 결과에 해당하는 해시 버킷을 선택한다.
3-3. 동일한 SQL이 수행되었을 때 해당 해시 버킷 아래에는 오브젝트 핸들이 연결되어 있다. 그러므로 연결된 오브젝트 핸들 뒤에서부터 액세스 하여 동일 SQL을 검색한다.
3-4-1. 찾고자 하는 오브젝트 핸들을 발견하지 못하면 해당 SQL을 하드 파싱한다. 그리고 해당 버킷 마지막 오브젝트 핸들 뒤에 파싱 정보를 추가한다.
3-4-2. 동일 내용의 오브젝트 핸들을 찾으면 해당 SQL 수행 정보, 실행 계획을 재사용한다. 재사용 시 SQL문 분석, 오브젝트 확인, 실행계획 수립 절차를 스킵하여 파싱에 대한 부하를 감소시킨다. 그러므로 전체 실행 시간, 자원 사용 또한 감소한다. 단, 동일 SQL 조건은 대/소문자 일치, 띄어쓰기 일치, 오브젝트 소유자 일치를 모두 만족해야 한다.
4. 최적화:
더 나은 실행 계획을 생성하기 위해 쿼리를 변경하는 단계
5. TM락:
파싱 트리를 만드는 동안 테이블의 삭제 방지를 위해 잠깐 동안 테이블에 TM 락을 수행한다.
LRU: Least Recently Used
프로세스 스케줄링 기법 중 하나. SQL 파싱 정보를 해시 테이블에 저장하기 위해서 프리 청크라고 하는 여유 공간이 필요하다. 해당 조각은 공유 풀 래치에 의해 할당되고 LRU 알고리즘이 사용된다. LRU 리스트의 양 끝을 MRU End와 LRU End라고 한다. 사용이 완료되면 MRU End에 위치하고 시간이 흐르면서 LRU End쪽으로 이동한다. 프리 리스트에 사용 가능한 메모리 조각이 없을 때 LRU End에 위치한 메모리 공간부터 비워져 프리 리스트에 추가된다.
예약된 공간:
크기가 큰 SQL (4400 Byte 이상) 이 수행될 경우 해당 SQL 정보를 저장할 메모리 조각을 찾지 못하는 경우를 대비하여 설정한다. 파라미터명은 SHARED_POOL_RESERVED_SIZE이다. 기본값은 공유 풀의 5%이다. 또한 공유 풀의 50% 이상 지정할 수 없다.