SQL 문장이 수행되는 과정
┌ Soft Parse ┐
SQL 문장 → Syntax Check → Semantic Check → Shared Pool Check → Optimization → Row Source Generation → Execution
1. Select 문장의 실행 원리
Parse → Bind → Execute → Fetch
(구문분석) (값 치환) (실행) (인출)
<SELECT 문장의 수행 단계>
(1) Parse (구문분석 단계)
1) 문법 검사 (Syntax check) SELECT, FROM, WHERE
2) 의미 검사 (Semantic check) 컬럼, 테이블명, 조건 등
3) 권한 검사
4) 실행 계획
1, 2 확인 하기 위해 데이터 딕셔너리 사용
자주 사용하는 데이터 딕셔너리를 캐싱해 두어서 성능을 높이는 역할을 하는 곳이 Shared Pool 안에 있는 Dictionary Cache (Row Cache 라고도 한다.)
SQL 문장이 오류가 있는지 없는지 점검한 후 오류가 없다면 이 SQL 문장을 ASCII 값으로 (숫자 값) 변경을 한 후 해당 숫자 값을 HASH 함수를 통해 특정 HASH 값으로 변경하게 된다. 그리고 여기서 얻은 HASH VALUE 를 Shared Pool 의 Library Cache 에 Hash Value 들과 비교해서 동일한 값이 있는지 확인하게 된다.
이 과정을 커서 공유 또는 Soft Parse 라고 한다.
Hash 함수는 입력된 값이 같을 경우 늘 출력 결과가 같고 입력 값이 다를 경우 출력 값은 항상 다르다는 것을 보장해주는 함수로 주로 오라클에서 데이터가 서로 같은지 다른지 비교할 때 많이 사용한다.
Hash 함수를 이용하여 데이터를 비교하는 방식은 성능이 아주 빠르고 정확하기 때문에 대용량 데이터를 비교해야만 하는 Join 에서 인덱스가 있다 하더라도 인덱스를 사용하지 않고 Hash 함수를 비교하는 Hash Join 방법이 아주 많이 사용된다.
커서(cursor) 란 메모리에 어떤 데이터를 저장하기 위해 만드는 임시 저장공간 같은 의미이다.
공유 커서, 세션 커서, 어플리케이션 커서
Library Cache 안에 있는 커서는 공유커서를 말한다.
공유 커서의 역할은 한번 수행되었던 SQL 문장의 실행계획과 관련정보를 보관하고 있다가 재활용함으로써
Hard Parse(Optimizer 가 실행계획을 만들어주는 것)의 부담을 줄여 SQL 문장의 수행 속도를 빠르게 하는 것이다.
예전에 가봐서 아는 길을 누구에게 물어볼 필요도 없이 기억으로 금방 찾아가는 것 (Soft Parse) 과 같은 이치이다.
공유커서는 크게 부모커서 (Parent Cursor) 와 자식 커서 (Child Cursor) 로 나뉘게 되는데 SQL 문장 자체에 대한 값은
Parent Cursor 에 있으나 사용자 정보나 Optimizer Mode 같은 정보는 Child Cursor 에 있게 된다.
커서 공유란 부모 커서와 자식 커서 모두가 완전히 동일해야만 이루어지게 되는 것이다.
'어떤 커서에 어떤 데이터가 들어있다' 라는 것을 리스트로 관리하는데 이 리스트를 Hash List 라고 부른다.
체인 구조로 다음 데이터가 연결되어 있다.
Heap 구조라는 것은 순서가 보장에 되지 않고 빈자리가 있으면 그냥 마구 저장하는 구조이다.
순서를 알 수 없다. 저장할 때는 속도가 빠른데 찾을 때는 시간이 오래 걸린다는 단점이 있다.
Library Cache 안에서 원하는 SQL 문과 실행 계획이 들어있는 커서를 찾기 위해서는 반드시 Hash List 를 읽어야 한다.
문제는 Library Cache 의 내용을 저장하고 있는 Hash list 가 1개 밖에 없다는 것이다.
동시 사용자가 많을 경우
Library Cache 를 탐색하기 위해서는 반드시 Library Cache Latch 를 가지게끔 정하고 있다.
(2) BIND (바인드)
(3) Excute (실행)
(4) Fetch (인출)
2. Update 문장의 실행 원리
Parse 단계
Execute 단계
Database Buffer Cache 에 블록 가져온 후
Redo log Buffer 에 변경 내역 기록
Undo Segment 에 원본 이미지 기록
Database Buffer Cache 에 기록