n 사용자가 SQL문장(select)을 실행
- 오라클 서버측 리스너가 서버 프로세스로 SQL문장을 전달한다.
n SQL 파싱
- 클라이언트에서 보내온 SQL 구문이 서버프로세스 PGA 내부의 Private SQL Area에서 문법체크(Syntax Check)를 우선 진행하고, 테이블 및 컬럼이 있는지, 해당 USER가 테이블 및 컬럼을 SELECT할 권한이 있는지(Semantic Check)를 Data Dictionary를 통해 체크한다. Shared Pool의 Library Cache를 조회해서 동일한 SQL문장이 있는지 확인하는데 문자 하나하나 공백, 대소문자까지 비교하여 동일한 SQL문장이 있다면 기 생성된 Library Cache의 parse-tree와 Query Execution Plan을 가지고 와서 실행한다. 이를 Soft Parsing 이라고 한다. 동일한 SQL문장이 없다면 이후 parse-tree를 만들고 나중을 위해 Library Cache에 저장한다.
- SQL구문이 Syntax, Semantic 체크를 모두 통과하였다면 이 SQL 구문은 오류가 없는 문장이 된다. 문장에 해싱 알고리즘을 적용하여 해시키를 만들고 해시키를 이용하여 Library Cache 내의 Shared SQL Area에서 동일한 해시키 값을 가지는 SQL문장이 존재하는지를 체크한다.(Shared Pool check, V$SQL.SQL_ID) SQL구문을 보낸 사용자나 옵티마이저 MODE 관련 설정까지 일치하는 SQL커서가 존재하고 있다면 더이상 추가 작업 없이 그 SQL 정보를 이용하게 되며 이를 소프트 파싱이라 하고 일치하는 SQL커서가 존재하지 않을 경우 이를 하드 파싱이라고 한다. 하드 파싱은 필요한 오브젝트의 래치(Use Serialization Device)를 획득 후 빈번히 라이브러리 캐시 및 데이터 딕셔너리를 탐색하게 되어 성능이 떨어지게 된다. 일반적으로 소프트 파싱은 optimization, row source generation 과정을 생략하고 직접 execution 단계로 가서 처리를 하게 된다.
- SQL커서가 없다면 Parsing된 SQL문장(쿼리 블럭의 set)을 Optimizer(Query Transformer, Estimator, Plan Generator)로 전달한다.
[그림 : Shared Pool Check]
n SQL 최적화(Optimizer)
n [그림 : SQL문 처리과정]
- Query Transformer : 쿼리블록으로 나누어 변형된 몇 종류의 쿼리문을 생산, 서브쿼리를 조인으로 변경, 뷰의 해체작업, 인라인뷰의 해체작업, FROM절의 테이블 제거작업, 조인조건 푸시, 뷰 조건 푸시, 서브쿼리를 조인으로 변경 등 쿼리를 변형한다.
- Estimator : 주어진 SQL문장의 모든 Cost를 측정한다. Selectivity(선택도), Cardinality, Cost 등 세 가지 다른 측정방법을 이용하며 최소의 비용을 갖는 SQL문장을 Plan Generator에게 넘긴다.
- Plan Generator : 선택된 저비용 SQL문의 실행계획을 생성하여 Row Source Generator에게 넘긴다. 이렇게 생성한 실행계획도 나중을 위해 Library Cache에 저장해 둔다.
- Row Source Generator : 실행계획의 각 단계를 실행하고 각 단계별로 결과를 리턴하며 Row Source Generator는 Row Source Tree(명령문에 의해 참조되는 테이블의 순서, Access Method, Join Method, Filter/Sort/Aggregation과 같은 데이터 오퍼레이션을 포함)를 생산한다. Row Source에는 테이블, 뷰, 조인이나 그룹핑의 결과 등이 해당된다.