본문 바로가기

Data Science/SQLP

[Oracle] 1. SELECT문 처리과정

반응형

1. Server Process 구조
유저 프로세스 -> 서버 프로세스로 SELECT문 요청시
서버 프로세스에서 SELECT문 처리 과정에 따라 처리

서버 프로세스 구조
공유메모리 영역과 백그라운드 프로세스 영역으로 나뉘어져 있다.

공유메모리 영역 -> SGA
SGA -> 공유 풀, DB 버퍼 캐시, 리두 로그 버퍼
공유 풀 메모리 -> 라이브러리 캐시영역, 로우 캐시영역
라이브러리 캐시 영역 : SQL문장 실행 정보를 관리
로우 캐시 영역 : 오브젝트 딕셔너리 정보가 로우단위로 저장


백그라운드 프로세스 영역 -> 인스턴스와 데이터베이스
인스턴스에는 DBWn, SMON, CKPT, PMON, LGWR
데이터베이스에는 컨트롤 파일, 데이터 파일, 온라인 리두 로그 파일

2. Select문 처리 과정 [공유 풀 -> 버퍼 캐시 -> 데이터 파일을 거쳐 처리]
(1) 파싱
1) 신텍스 체크 : 문법 확인
2) 시멘틱 체크 : 로우 캐시영역에서 SELECT문이 참조하는 오브젝트들의 존재 유무와 권한 검사
-> 해당 SELECT 문장에 해시 함수를 입력을 받아서 해시 값으로 리턴

3) 라이브러리 캐시 탐색 :
리턴된 해시 값을 이용해 공유 풀 영역의 라이브러리 캐시메모리에 이전에 실행된 적 있는지 탐색하는 것으로
먼저, 라이브러리 캐시영역을 관리하고 있는 라이브러리 캐시 래치를 획득 [라이브러리 캐시 메모리는 해시 버킷 구조에 의해 관리]

[해시 버킷 구조 : 각각의 버킷이 같은 해시 값을 가지고 있는 라이브러리 캐시 핸들이 체인 형태로 걸려있고, 이 라이브러리 캐시 핸들이 하나의 라이브러리 캐시 오브젝트 [LCO]를 1:1로 관리]

3-1) 래치 획득 후 버킷 탐색 시 이전에 실행된 적 없어서 동일한 SQL 문장을 이름으로 갖는 LCO가 존재하지 않을 경우 Hard Parsing 발생.
3-2) 래치 획득 후 버킷 탐색 시 이전의 LCO가 존재하고, 실행계획이 존재할 경우 Soft Parsing 발생.

Hard Parsing : 새롭게 저장되는 정보들의 LCO와 실행계획을 저장. 따라서 저장하기 위해 공유 풀 메모리에서 공간을 할당받는다.

공유 풀 메모리는 기본적으로 하나의 최상위 힙을 갖고, 힙에 의해 메모리가 관리된다. [최상위 힙은 여러개의 익스텐트가 연결리스트 형식으로 구성되며, 각각의 익스텐트는 청크라는 메모리 단위로 구성]

전반적인 힙 메모리 구조를 공유 풀 래치에 의해서 관리를 하고 있기 때문에 메모리를 할당 받기위해 공유 풀 래치를 획득 한 이후, 프리 청크 리스트인 프리 리스트로부터 탐색 시작.
프리 리스트로부터 프리 청크 획득을 실패 했을 때, 현재 사용중이지 않은 재사용 가능한 LRU리스트로부터 프리 청크 할당 후 이 프리 청크 획득할 때까지 공유 풀 래치를 보유
메모리 할당 후 해당 SELECT문을 이름으로 갖는 LCO를 관리하게 될 핸들에 대해서 라이브러리 캐시 락을 익스클루시브 모드로 획득.

라이브러리 캐시 락 획득 후, LCO 정보를 생성한다. 실행 계획 생성 전에 핸들에 대한 락과, 자식 LCO에 대한 참조를 막기 위해 자식 LCO를 관리하는 핸들에 대한 락을 널 모드로 바꾼다.
또한 자식 LCO에 대한 라이브러리 캐시 핀을 익스클루시브 모드로 획득하고 실행계획 생성

마지막으로, 자식 LCO에 대한 라이브러리 캐시 핀을 공유 모드로 설정.

Soft Parsing : 핸들에 대해 라이브러리 캐시 락을 공유 모드로 획득 후, 실행 계획 획득 받아 실행
실행 계획 획득 후, 핸들에 대한 락을 널 모드로, 자식 LCO에 대한 라이브러리 캐시 핀을 공유 모드로 설정 후 문장 실행


(2) 실행:
파싱 과정으로부터 생성된 실행 계획을 이용해 SGA 영역의 버퍼 캐시 메모리에서 문장의 실행과정이 진행

버퍼 캐시 영역 또한 해시 버킷에 의해 관리
: 각각의 버킷이 같은 해시 값을 갖고 있는 버퍼 캐시영역의 버퍼들의 위치를 포인터로 가리키고 있는 버퍼 헤더들이 체인 형태로 연결

버퍼 헤더들의 해당 해시 체인 구조는 공유 풀 메모리에 저장
실제 버퍼에 대한 데이터들은 버퍼 캐시 메모리에 저장

버퍼 헤더는 더티 버퍼 리스트인 LRUW 리스트와 프리 버퍼 포함한 버퍼들의 리스트인 LRU 리스트로 연결
두 리스트는 항상 짝으로 존재하며, 이 짝을 워킹 셋이라고 한다.

하나의 워킹 셋은 하나의 캐시 버퍼 LRU 체인 래치에 의해 1:1로 관리되며, 다수의 해시 버킷은 하나의 캐시 버퍼 체인 래치에 의해 1:N 관계로 관리된다.

실행계획의 데이터 블록 주소(DBA와 블록 종류가 포함된 클래스 넘버를 해시 함수에 입력해서 해시 값 리턴
리턴받은 해시 값을 이용해 버퍼 캐시 영역에 유저가 요구하는 데이터가 포함된 블록의 적재여부를 확인한다.

버퍼 캐시를 확인하기 위해 버퍼를 포인터로 가리키고 있는 버퍼 헤더를 탐색한다.
버퍼 헤더를 탐색하기 위해 버퍼 헤더들을 관리하고 있는 캐시 버퍼 체인 래치를 획득한 이후 버킷을 탐색

(2-1) 버퍼 헤더가 존재하지 않고, 필요한 데이터가 존재하는 블록이 버퍼 캐시 메모리에 로드되어있지 않은 경우 Cache Miss 발생
(2-2)버퍼 헤더가 존재하고, 필요한 데이터가 존재하는 블록이 버퍼 캐시에 올라와있는 경우 Cache Hit 발생

Cache Miss : 캐시 미스 발생시 원하는 블록을 읽는 프리버퍼가 필요하다.
프리버퍼를 탐색하기 위해서 LRU 리스트를 관리하는 캐시버퍼 LRU 체인 래치를 획득한 이후, 프리 버퍼 리스트인 LRU 보조 리스트 먼저 프리버퍼를 스캔한다.

LRU 보조 리스트에서 프리 버퍼 미획득시 터치 카운트 기반의 LRU 알고리즘을 사용한 LRU 메인 리스트를 검색
사용빈도가 낮고 콜드영역의 꼬리 쪽부터 프리 버퍼 스캔
스캔 중 터치 카운트가 1 이하인 것을 프리 버퍼로 사용하며, 프리 버퍼 발견 시 해당 버퍼를 포인터로 가리키고 있는 버퍼 헤더를 찾아가 해당 버퍼에 대한 락을 익스클루시브 모드로 획득
락 획득 후 데이터파일로부터 디스크 I/O를 통해 해당 블록을 버퍼로 적재
적재 후 버퍼 락 해제

해당 버퍼는 더티 버퍼가 되며 터치 카운트를 1증가 후 콜드 영역의 헤드 부분으로 이동시킨다.
물리적 읽기 : 물리적으로 I/O를 통해 데이터파일로부터 블록을 적재시키는 과정


Cache Hit : 버퍼를 사용해 버퍼를 읽는다.
버퍼 헤더를 읽기 위해 버퍼 헤더에 대해 해당 버퍼의 버퍼 락을 공유 모드로 획득 후 메모리 I/O를 통해 버퍼를 읽는다.
논리적 읽기 : 래치 획득 후부터 메모리 I/O를 통해 버퍼를 읽는 과정

(3) 패치 :
데이터 중 사용자가 원하는 데이터만을 추출해 데이터를 전송하는 과정
[서버 프로세스의 최소 I/O 단위가 블록인데, 블록에는 원하는 데이터와 원하지 않은 데이터가 함께 들어가 있기 때문에]

반응형