n 사용자가 SQL문장(select)을 실행
- 오라클 서버측 리스너가 서버 프로세스로 SQL문장을 전달
n SQL 파싱
- 서버프로세스는 Shared Pool의 LibraryCache를 조회해서 동일한 SQL문장이 있는지 확인하는데 문자 하나하나 공백, 대소문자까지 비교하여 이미 있다면 Library Cache의 parse-tree와 Query Execution Plan을 가지고와서 실행한다. 이를 Soft Parsing 이라하고, 없다면 먼저 사용자 SQL 문장의 문법체크(Syntax Check)를 우선 진행하고, 데이블 및 컬럼이 있는지, 해당 USER가 데이블 및 컬럼을 SELECT할권한이 있는지(Semantic Check)를 DataDictionary를 통해 체크하는데 이후 parse-tree를 만들고 나중을 위해 Library Cache에 저장한다.
Syntax, Semantic 체크를 모두 통과하였다면 이 SQL 구문은오류가 없는 문장이 되며 해당 문장에 해싱 알고리즘을 적용하여 해시키를 만들고 해시키를 이용하여 검색하여 동일한 해시키값을 가지는 SQL문장을 검색하여 존재하는지를 체크한다(Shared Pool check, V$SQL.SQL_ID). SQL구문을 보낸 사용자나 옵티마이저 MODE관련 설정까지 일치하는 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)
- 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는 테이블, 뷰,조인이나 그룹핑의 결과등이 해당된다.
SELECT empno, ename,dname
FROM emp e, dept d
WHERE e.deptno =d.deptno;
----------------------------------------------------------------------
| Id |Operation |Name |
----------------------------------------------------------------------
| 0 |SELECT STATEMENT | |
| 1| NESTED LOOPS | |
| 2| NESTED LOOPS | |
| 3| TABLE ACCESS FULL |DEPT |
|* 4 | INDEX RANGE SCAN | IDX_EMP_DEPTNO|
| 5| TABLE ACCESS BY INDEX ROWID |EMP |
------------------------------------------------------------------------
[그림 : Row Source Tree]
n 실행(Execution)
SQL실행 엔진이 각각의 Row Source Tree의 각각 로우 소스를 실행하여 결과를 Client로 보낸다. (INSERT/UPDATE/DELETE같은 DML인 경우 반드시 거쳐야 한다.)
실행기간동안 DB는 메모리에 데이터가 없는 경우 디스크로부터 데이터를 읽으며 SQL문의 실행에 따른 변화를 로깅하거나 데이터 무결성을 지키기 위해 DBLOCK을 걸거나 LATCH를 획득한다.
n 추출(Fetch)
- 서버 프로세스가 DataBase Buffer Cache에 저장된 데이터를 읽어 User Process에게 결과를 넘겨준다. (DML인 경우에는 수행하지 않는다.)
[그림: SQL문 처리과정]
댓글 없음:
댓글 쓰기