2016년 10월 5일 수요일

[SQL학원,오라클학원☞탑크리에듀][SQL,SELECT문처리순서/과정]parsing,optimization,execution,fetch,옵티마이저,파싱,실행,패치

[SQL,SELECT문처리순서/과정]parsing,optimization,execution,fetch,옵티마이저,파싱,실행,패치

10.1 SQL문 처리과정
 
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]
 
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문 처리과정]

댓글 없음:

댓글 쓰기