4.4 Iterative Type 전략

{code:SQLtitle= 서브쿼리가 3개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = iterative --> Iteration 횟수 : N+1
SU: Using search type: iterative
SU: Starting iteration 1, state space = (2,3,4) : (1,1,1) --> 첫 번째 Turn 시작
SU: Updated best state, Cost = 1435.51 --> 각 Iteration별로 Cost를 구하여
SU: Starting iteration 2, state space = (2,3,4) : (0,1,1) 최저 Cost일 경우 Best State(최적상태)로 Update.
SU: Not update best state, Cost = 22208.92
SU: Starting iteration 3, state space = (2,3,4) : (1,0,1)
SU: updated best state, Cost = 1425.02 --> 최저 Cost이므로 Best State(최적상태)로 Update.
SU: Starting iteration 4, state space = (2,3,4) : (1,1,0)
SU: Not update best state, Cost = 385405.50 --> 첫 번째 Trun 종료
SU: Starting iteration 2, state space = (2,3,4) : (0,1,0) --> 두 번째 Turn 시작
SU: Not update best state, Cost = 385004.97 --> 최저 Cost를 구할 활율을 높이기 위해 추가적으로
SU: Starting iteration 4, state space = (2,3,4) : (1,0,0) 두 번째 Turn인 Iteration2 와 Iteration4를 고려하고있다
SU: Not update best state, Cost = 385390.90 --> 두 번째 Turn 종료
SU: Will unnest subquery SUBQ3 (#2)
SU: Will not unnest subquery SUBQ2 (#3) --> SUBQ2를 Unnesting 하진않았으므로 (1,0,1)을 적용
SU: Will unnest subquery SUBQ1 (#4)
SU: Reconstructing original query from best state. --> best state(Iteration 3)로부터 Original Query 재작성
{code}
h4. 첫 번째 Turn의 규칙
* Iteration1 에서 모든 서브쿼리블럭을 Unnesting한다.(1,1,1)
* 이후 Iteration2~4 에서는 숫자표기법중의 0이 N+1번만큼 반복되며 서브쿼리 개수가 늘어나더라도 동일하게 적용된다.
h4. 두 번째 Turn의 규칙
* 추가작업(두번째 Trun)에만 나타나며 N-1번만큼 반복된다.
* 두 번째 Turn에서는 첫 번째 Turn에서 사용되었던 메모리 공간(Iteration2, Iteration4)을 재사용 한다.
* 최저 Cost로 Update된 Iteration 메모리 공간은 재사용되지 않는다.
* 첫 번째 Turn에서 최저 Cost로 Update 된 상태를 보존해야 추가적인작업에서 생성된느 각각의 Cost들과 비교할 수 있기 때문
* 11.1.0.6이하 버전에서는 최저 Cost를 가진 Iteration인지 여부와 상관없이 모든 Iteration의 메모리공간에 Update한다.
{code:SQLtitle= 서브쿼리가 5개인 경우의 Trace 내용borderStyle=solid}
*******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = iterative
SU: Using search type: iterative
SU: Starting iteration 1, state space = (2,3,4,5,6) : (1,1,1,1,1) --> 첫 번째 Turn 시작
SU: Updated best state, Cost = 1459.38
SU: Starting iteration 2, state space = (2,3,4,5,6) : (0,1,1,1,1)
SU: Not update best state, Cost = 1743.70
SU: Starting iteration 3, state space = (2,3,4,5,6) : (1,0,1,1,1)
SU: Not update best state, Cost = 29274.74
SU: Starting iteration 4, state space = (2,3,4,5,6) : (1,1,0,1,1)
SU: Not update best state, Cost = 2040.81
SU: Starting iteration 5, state space = (2,3,4,5,6) : (1,1,1,0,1)
SU: Updated best state, Cost = 1446.45 --> 최저 Cost
SU: Starting iteration 6, state space = (2,3,4,5,6) : (1,1,1,1,0)
SU: Not update best state, Cost = 18917.48 --> 첫 번째 Turn 종료
SU: Starting iteration 2, state space = (2,3,4,5,6) : (0,1,1,1,0) --> Iteration 2 가 재사용됨
SU: Not update best state, Cost = 259747.79
SU: Starting iteration 3, state space = (2,3,4,5,6) : (1,0,1,0,1) --> Iteration 3 이 재사용됨
SU: Not update best state, Cost = 9029.28
SU: Starting iteration 4, state space = (2,3,4,5,6) : (1,1,0,0,1) --> Iteration 4 가 재사용됨
SU: Not update best state, Cost = 2026.45
SU: Starting iteration 6, state space = (2,3,4,5,6) : (1,1,1,0,0) --> Iteration 6 이 재사용됨
SU: Not update best state, Cost = 360380.74
SU: Will unnest subquery SUBQ5 (#2)
SU: Will unnest subquery SUBQ4 (#3)
SU: Will unnest subquery SUBQ3 (#4)
SU: Will not unnest subquery SUBQ2 (#5)
SU: Will unnest subquery SUBQ1 (#6)
SU: Reconstructing original query from best state.
{code}
* 두 번째 Turn의 결과로 4개(N-1)의 조합이 고려된다.
* (0,1,1,1,0)처럼 Unesting 되지 않는 서브쿼리가 2개씩 나타났다.
* Iteration1과 최저 Cost를 가진 Iteration5를 제외한 모든 Iteration의 메모리 공간을 재사용
{code:SQLtitle= 서브쿼리가 6개인 경우의 Trace 내용borderStyle=solid}
SU: Using search type: iterative
SU: Starting iteration 1, state space = (2,3,4,5,6,7) : (1,1,1,1,1,1) --> 첫 번째 Turn 시작
SU: Updated best state, Cost = 1463.88
...중간생략
SU: Starting iteration 7, state space = (2,3,4,5,6,7) : (1,1,1,1,1,0)
SU: Not update best state, Cost = 14428.86 --> 첫 번째 Turn 종료
SU: Starting iteration 2, state space = (2,3,4,5,6,7) : (0,1,1,1,1,0) --> 두 번째 Turn 시작
SU: Not update best state, Cost = 18920.69
SU: Starting iteration 3, state space = (2,3,4,5,6,7) : (1,0,1,1,0,1)
SU: Not update best state, Cost = 1735.07
SU: Starting iteration 4, state space = (2,3,4,5,6,7) : (1,1,0,1,0,1)
SU: Not update best state, Cost = 24239.94
SU: Starting iteration 5, state space = (2,3,4,5,6,7) : (1,1,1,0,0,1)
SU: Not update best state, Cost = 1783.44
SU: Starting iteration 7, state space = (2,3,4,5,6,7) : (1,1,1,1,0,0)
SU: Not update best state, Cost = 270522.74 --> 두 번째 Turn 종료
{code}
h4. 추가적인 두 번째 Turn의 규칙
* 0이 한칸씩 오른쪽으로 이동하면서 Iteration이 증가,
* 0을 기준으로 그 왼쪽에는 1을 채우고 있다.
* 0을 기준으로 그 오론쪽숫자들은 두번째 Turn 중에서 가장 처음 시도되는 Iteration과
가장 마지막에 시도되는 Iteraion에는 0을 제일 오른쪽에 채운다. 나머지는 오른쪽에서 두번째에 위치한다.
{code:SQLtitle= 서브쿼리가 7개인 경우의 Trace 내용borderStyle=solid}
*************************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = iterative
SU: Using search type: two pass -->Two pass로 바뀐다.
{code}