(ORACLE교육동영상)오라클 SQL문 실행과정, 하드파싱, 소프트파싱, 최적화, Optimizer, Row Source Generation, 파싱트리, 오라클학원, 자바학원, 오라클자바동영상
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=704
ojc.asia







오라클 SQL문 처리과정
파싱, 최적화, 행 소스 생성, 실행
(Parsing, Optimization, Row Source Generation, Execution)
SQL구문의 실행은 파싱, 최적화(Optimization), Row Source Generation, 그리고 최종 실행과정을 거칩니다.

- 사용자가 SQL문장(select)을 실행
- 오라클 서버측 리스너가 요청을 받아 디스패처를 경우하여 서버 프로세스로 SQL문장을 전달 합니다.

- SQL 파싱(구문 분석 단계)
- 클라이언트에서 보내온 SQL 구문이 서버프로세스 PGA 내부의 Private SQL Area에서 문법체크(Syntax Check)를 우선 진행하고, 테이블 및 컬럼이 있는지, 해당 USER가 테이블 및 컬럼을 SELECT할 권한이 있는지(Semantic Check)를 Data Dictionary를 통해 체크한다.
- Shared Pool Check : Shared Pool의 Library Cache를 조회해서 동일한 SQL문장이 있는지 확인하는데 문자 하나하나 공백, 대소문자까지 비교하여 동일한 SQL문장이 있다면 이를 Soft Parsing 이라고 하고 기 생성된 Library Cache의 Query Execution Plan, parse-tree를 가지고 와서 실행 합니다. 동일한 SQL 문장이 없다면 이후 parse-tree를 만들고 추후 사용을 위해 Library Cache에 저장하는데 이를 하드 파싱 이라고 합니다. 소프트 파싱은 optimization, row source generation 과정을 생략하고 직접 execution 단계로 가서 처리를 하게 됩니다.

[SQL문 실행시의 Shared Pool Check]
- SQL 최적화(Optimization)

- [그림 : SQL문 처리과정]
- Query Transformer : 쿼리블록으로 나누어 변형된 몇가지 종류의 쿼리문을을 생산해서 Estimator에 넘깁니다. 서브쿼리를 조인으로 변경, 뷰의 해체작업, 인라인뷰의 해체작업, FROM절의 테이블 제거작업, 조인조건 푸시, 뷰 조건 푸시, 서브쿼리를 조인으로 변경, 조인을 서브쿼리로 변경등 쿼리를 변형 합니다.
- Estimator : 주어진 SQL문장의 모든 Cost를 측정한다. Selectivity(선택도), Cardinality, Cost 등 세 가지 다른 측정방법을 이용하며 최소의 비용을 갖는 SQL문장을 Plan Generator에게 넘긴다.
- Plan Generator : 선택된 저비용 SQL문의 실행계획을 생성하여 Row Source Generator에게 넘긴다. 이렇게 생성한 실행계획도 나중을 위해 Library Cache에 저장해 둡니다.
- Row Source Generation
- 옵티마이저에게 최적의 실행계획을 수신하여 SQL 명령문이 참조하는 테이블의 순서, 테이블에 대한 액세스방법, 조인방법, 필터, 정렬방법등이 기록되어 있는 Row Source Tree와 이를 SQL엔진이 실행 할 수 있도록 실행가능한 바이너리 코드로 생성 합니다.
SELECT e.last_name, j.job_title, d.department_name
FROM hr.employees e, hr.departments d, hr.jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
AND e.last_name LIKE 'A%';
실행계획
Execution Plan
----------------------------------------------------------
Plan hash value: 975837011
-----------------------------------------------------------
| Id| Operation | Name |Rows|Bytes|Cost(%CPU)|Time |
-----------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 189 | 7(15)| 00:00:01 |
|*1 | HASH JOIN | | 3 | 189 | 7(15)| 00:00:01 |
|*2 | HASH JOIN | | 3 | 141 | 5(20)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 3 | 60 | 2 (0)| 00:00:01 |
|*4 | INDEX RANGE SCAN | EMP_NAME_IX | 3 | | 1 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | JOBS | 19 | 513 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | DEPARTMENTS | 27 | 432 | 2 (0)| 00:00:01 |
-----------------------------------------------------------
해시조인은 드라이빙 테이블을 읽어 메모리에 해시테이블 형태로 생성하고 이것과 후행 테이블의 데이터를 해시함수로 한방에 조인하는 형태로 해시조인을 하는 부분에서 Access Predicate가 발생합니다.
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
2 - access("E"."JOB_ID"="J"."JOB_ID")
4 - access("E"."LAST_NAME" LIKE 'A%')
filter("E"."LAST_NAME" LIKE 'A%')
Predicate란? 인덱스 접근시 컬럼액세스정보, 조인정보, Filter정보를 실행계획의 각 Operation 단위로 나타낸것 입니다.
access predicate : Data Block을 어떤 방식으로 Access해서 읽었는지를 나타냅니다.
filter predicate : Data Block을 읽고나서 데이터를 어떻게 필터링 했는지를 나타냅니다.

[그림 : Row Source Tree]
출처 https://docs.oracle.com/database/121/TGSQL/tgsql_sqlproc.htm#TGSQL186
- 실행(Execution)
SQL실행 엔진이 Row Source Tree에 의해 생성된 트리의 각 Row Source를 실행 합니다. 일반적으로 실행 단계의 순서는 실행계획의 순서와 반대이므로 아래에서 위로 읽으면서 SQL결과를 만들어 냅니다. 이미 한번이상 SQL구문이 실행되었다면 Database Buffer Cache에 데이터가 있으므로 메모리 I/o를 통해 빠르게 데이터를 추출하는데, 그렇지 않다면 하드디스크의 Datafile에서 블록 단위로 데이터를 읽어 Database Buffer Cache에 적재후 클라이언트로보내게 됩니다.
- 추출(Fetch)
서버 프로세스가 Database Buffer Cache에 저장된 데이터를 읽어 User Process에게 결과를 넘겨준다.(DML인 경우에는 수행하지 않습니다.)
#ORACLE교육, #오라클동영상, #SQL문실행과정, #SQL실행순서, #하드파싱, #소프트파싱, #최적화, #Optimizer, #RowSourceGeneration, #파싱트리, #오라클교육, #ORACLE교육, #SQL교육, #SQL학원, #오라클학원, #ORACLE학원, ORACLE교육, 오라클동영상, SQL문실행과정, SQL실행순서, 하드파싱, 소프트파싱, 최적화, Optimizer, RowSourceGeneration, 파싱트리, 오라클교육, ORACLE교육, SQL교육, SQL학원, 오라클학원, ORACLE학원,