{code:SQL | title= 서브쿼리가 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:SQL | title= 서브쿼리가 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:SQL | title= 서브쿼리가 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:SQL | title= 서브쿼리가 7개인 경우의 Trace 내용 | borderStyle=solid} ************************************* PARAMETERS WITH ALTERED VALUES ****************************** _optimizer_cost_based_transformation = iterative SU: Using search type: two pass -->Two pass로 바뀐다. {code} |