메뉴 건너뛰기

bysql.net

1.4 Query Transformer의 구조

AskZZang 2011.08.28 22:06 조회 수 : 2023

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가 실행하면 ParserSQL을 쿼리블럭 별로 분할한다.

쿼리블럭을 구분하기 위하여 옵티마이져가 내부적으로 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(SQLQuery 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가 수행되면 쿼리블럭이 새로 생성된다.