{code:SQL | title= 서브쿼리가 3개인 경우의 Trace 내용 | borderStyle=solid} ************************************* PARAMETERS WITH ALTERED VALUES ****************************** -- 파라미터는 Default 값이므로 생략됨 -- 나머지는 Iterative Type과 동일, 서브쿼리 4,5늘려도 동일 {code} {code:SQL | title= 서브쿼리가 2개인 경우의 Trace 내용 | borderStyle=solid} ************************************* PARAMETERS WITH ALTERED VALUES ****************************** -- 파라미터는 Default 값이므로 생략됨 SU: Using search type: exhaustive --> Exhaustive로 바뀌었다. SU: Starting iteration 1, state space = (2,3) : (1,1) SU: Updated best state, Cost = 1026.01 SU: Starting iteration 2, state space = (2,3) : (1,0) SU: Not update best state, Cost = 384996.00 SU: Starting iteration 3, state space = (2,3) : (0,1) SU: Updated best state, Cost = 1012.78 SU: Starting iteration 4, state space = (2,3) : (0,0) SU: Not update best state, Cost = 384978.66 SU: Will not unnest subquery SUBQ2 (#2) SU: Will unnest subquery SUBQ1 (#3) SU: Reconstructing original query from best state. {code} * 테스트 결과 Iterative Type과 Linear Type동작방식이 완벽히 같았다. Liner Type알고리즘을 아직 반영못했다는 증거 |
※ 참고 Linera 접근법은 처음에 (1,1,1)의 Cost를 구하고 단계적으로 SUBQ3, SUBQ2, SUBQ1에 대하여 Unnesting여부를 결정한다. ex. (1,1,1)과 (0,1,1)의 Cost를 비교하여 SUBQ3의 Unnesting 여부를 판단할 수 있다. 이중에 (1,1,1)의 Cost가 저렴하다고 가정하면 SUBQ3는 Unnesting하는 것으로 확정된다. 다음 (1,1,1)과(1,0,1)의 Cost를 비교하여 SUBQ2의 Unnesting 여부를 판단한다. 계속하여 (1,1,1)의 Cost가 더 저렴하다면 SQBQ2또한 Unnesting 된다. 마지막으로 (1,1,0)과 (1,1,1)의 Cost를 비교하여 최종적으로 SUBQ1의 Unnesting여부를 판단하게 된다. 최종적으로 (1,1,0)이 선택되었다면 Linear Type에서 고려한 경우의 수는 총 4가지이며 다움과 같다. (1,1,1),(0,1,1),(1,0,1),(1,1,0) 이결과는 Exhaustive Type과 비교해보면 절반의 경우만 고려된다. 이방법을 적용하면 최적의 Cost는 보장할 수 없지만 대부분의 경우 Sub Optimal(다른말로 표현하면 Second Best) Plan을 구할 수 있다. 이 Linear Type의 동작방식은 'Dynamic Programing approach'라 불린다. 하지만 현재 상태에서 이것은 이론일 뿐, 테스트 결과 Linear Type은 Iterative Type과 똑같이 2 * N 가지의 경우를 고려한다. 아직까지 Linear Type접근법은 구현이 되지 않았다. |