(1) Transformation이란 무엇인가?
Oracle은 Query에 대해 Optimizaion을 수행하기 전(즉, 실행 계획을 생성하기 전)에 Transformation 과정을 수행한다.
Transformation이란 말 그대로 Query를 변형하는 과정을 의미한다.
"A"라는 Query를 요청해도 Oracle은 내부적으로 "B"라는 Query를 수행할 수 있다는 의미이다.
(2) Transformation을 수행하는 이유
우리는 SQL이라는 문법을 사용해 SQL문장을 작성하지만, Oracle은 그 문장이 어떻게 해야 최적의 비용으로 실행되는지에 대한
Rule을 가지고 있다. 따라서 Oracle은 우리가 작성한 문장이 어떻게 변형되어야 더 최적화(Optimization) 작업을 수행하기 쉬운지 잘 알고 있다.
Transformation 과정이 Logical Optimization으로 불리는 이유도 이 때문이다.
실제 Optimization(Physical Optimization) 과정이 더 잘 수행될 수 있도록 도와 주는 역할을 한다.
(3)왜 Transformation이 중요한가?
실행 계획을 해석하는데 있어서 필수적이기 때문이다. Transformation이 수행된 Query와 그렇지 않은 Query는 전혀 다른 실행 계획을 보인다.
실행 계획을 보고 Transformation이 수행되었는지, 수행되었다면 어떤 기법이 사용되었는지, 그리고 실행 계획의 변화에 어떤 작용을 했는지를 이해할 수 있어야 한다.
Transformation의 기본적인 목표는 (CBO 관점에서) 복잡한 Qeury를 단순한 Query로 바꾸는 것이다.
Oracle CBO의 Optimization 단위는 Query가 아니라 Query Block 이다.
select *
from (select * from t1 where t1.c1 = 1) v1, t2
where vi.c1 = t2.c1 and
t2.c1 in (select c3 from t3)
;
위의 Query는 모두 세 개의 Query Block으로 이루어져 있다.
Main Query, Inline View, Subquery
Oracle은 Inline View와 Subquery데 대해서 각각 Optimization을 수행한 후, 그 결과를 이용해서 다시 Main Query를 최적화한다.
만약 Transformation에 의해서 Inline View와 Subquery를 Main Query로 합칠 수 있다면?
select *
from t1, t2, t3
where t2.c1 = (semi) t3.c1 and
t1.c1 = t2.c1 and
t1.c1 = 1 and
t2.c1 = 1
;
단 하나의 Query Block만이 남는다. Oracle은 하나의 Query Block에 대해서만 Optimization을 수행하면 된다.