1.4 Query Transformer의 구조
2011.08.28 21:36
1.4 Query Transformation의 구조
[그림 1.4.1 옵티마이져 상세 구조도 참고]
세부적인 Transformation Unit 용어는 무시하라
Part 2와 Part 3에서 상세히 다룰 것이므로 여기서는 큰 그림과 설명에 집중!!
그림은 생각보다 어렵지 않다
Query Transformer를 Heuristic과 Cost Based로 구분하여 나타낸 점과 그 내부의 세부적인 Transformation Unit을 나타낸 것일뿐.
순서가 중요하다
Query Transformation은 순서가 정해져 있다.
예외) Transformation 간의 종속관계
Transformation 간의 상호작용
점선으로 표시된 Unit은 둘 중 하나만 수행된다
SSU(Simple Subquery Unnesting : Distinct나 Group By가 없는 서브쿼리를 조인으로 바꾸는 작업
CSU(Complex Subquery Unnesting : Distinct나 Group By가 있는 서브쿼리를 조인으로 바꾸는 작업
CVM(Complex View Merging : Distinct나 Group By가 있는 뷰이 해체작업
JPPD(Join Predicate Push Down : 뷰 내부에 조건절을 밀어 놓는 작업
SVM(Simple View Merging : 인라인뷰의 해체작업)
JE(Join Elimination : From 절의 테이블 제거 작업)
Heuristic 변환은 쿼리블럭마다 수행된다
기본적으로 모든 Heuristic Query Transformation은 쿼리블럭 레벨로 발생
쿼리블럭은 무엇인가
오라클은 서브쿼리나 뷰 혹은 인라인뷰를 각각 쿼리블럭으로 취급한다.
SQL을 User가 실행하면 Parser는 SQL을 쿼리블럭 별로 분할한다.
쿼리블럭을 구분하기 위하여 옵티마이져가 내부적으로 QB_NAME 힌트를 사용한다.
Cost Based 변환이 발생할 때 마다 Cost를 구해야 한다
- Cost Based Query Transformation의 각 Transformation Unit이 수행될 때 마다 Cost Estimator가 호출
- 서로 다른 종류의 CBQT가 수행될 때 마다 Query Block을 Cost Estimator에게 넘겨주면 Cost Estimator는 각각의 Cost를 계산하여 Return
- Cost Estimator는 단독으로 Cost를 계산할 수 없으며 Query Block을 Plan Generator에게 넘겨 주어 Plan을 만든 다음 각종 통계정보 등을 참조하여 Cost를 만든다.
쿼리블럭의 개념과 옵티마이져 구조도중 큰 그림의 이해는 매우 중요하다.
결론
1. SQL 실행 -> Parser(SQL을 Query Block 단위로 분리) -> Query Transformer -> Cost Estimator -> Plan Generator -> Row Source Generator -> SQL의 결과 Fetch
2. Query Transformation은 Heuristic과 Cost Based로 나눌 수 있다.
3. HQT와 CBQT에는 세부적인 Unit이 있다.
4. 각각의 세부적인 Unit들은 모두 수행될 수 있으나 특별한 경우 둘 중에 하나만 수행된다.
5. 각각의 세부적인 Unit들은 수행 순서가 정해져 있다.
6. 일반적인 Query Transformation의 수행순서는 그림 1.4.1에서 보여지는 것과 같다.
7. SQL은 여러 개의 쿼리블럭으로 구분할 수 있으며 뷰/인라인뷰, 스칼라 서브쿼리, 서브쿼리 마다 독자적인 쿼리블럭명을 가진다.
8. HQT는 쿼리블럭마다 수행된다. CBQT는 발생할 때 마다 Cost Estimator를 Call 하여 Cost를 구해야 한다. 따라서 Hard Parsing시 약간의 부하가 생길 수 있다. 대부분의 경우 CBQT가 수행되면 쿼리블럭이 새로 생성된다.