4.6 Two_Pass Type 전략

{code:SQLtitle= 서브쿼리가 3개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = two_pass
SU: Using search type: two pass
SU: Starting iteration 1, state space = (2,3,4) : (1,1,1)
SU: Updated best state, Cost = 1435.51
SU: Starting iteration 2, state space = (2,3,4) : (1,1,1)
SU: Not update best state, Cost = 1435.51
SU: Will unnest subquery SUBQ3 (#2)
SU: Will unnest subquery SUBQ2 (#3)
SU: Will unnest subquery SUBQ1 (#4)
SU: Reconstructing original query from best state.
{code}
* Iteration은 횟수는 2지만 실제로는 한번만 수행 한 것과 같다.((1,1,1)과(0,0,0)비교대신 (1,1,1)의 Cost만 구했다)
※참고
(0,0,0)을 적용한다는 것은 모든 서브쿼리에 대해 Filter를 적용한다는 것이다. 이 경우는 대부분 Unnesting 된 것에 비하여 Cost가 높다.
왜냐하면 서브쿼리가 인라인뷰로 바뀌면 Nested Loop/Merge/Hash Join등을 다양하게 적용할 수 있고 심지어 Semi Join까지 고려해 볼 수 있다.
조인 순서도 Physical 옵티마이져가 최적으로 조정할 것이다. 하지만 Filter의 경우는 이러한 선택이 주어지지 않으므로 대부분 Cost가 낮다.
서브쿼리 개수를 4,5,6,7로 변경해도 search type은 변화지 않았다.
{code:SQLtitle= 서브쿼리가 2개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = exhaustive --> exhaustive로 변경됐다.
{code}
* 서브쿼리 2개정도는 모든경우의수(4회)를 고려해도 큰부하가 없다고 판단