4.3 Exhaustive Type 전략

{code:SQLtitle= 서브쿼리가 3개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = exhaustive --> Search Type을 Exhaustive로 바꾼 경우
SU: Using search type: exhaustive -- 'PARAMETERS WITH ALTERED VALUES' 항목에 먼저 나타난다.
SU: Starting iteration 1, state space = (2,3,4) : (1,1,1)
SU: Updated best state, Cost = 1435.51 --> 각 Iteration별로 Cost를 구하여 최저 Cost일 경우 Best State(최적상태)로 Update.
SU: Starting iteration 2, state space = (2,3,4) : (1,1,0)
SU: Not update best state, Cost = 385405.50 --> Cost가 Iteration 1보다 높으므로 Update하지 않는다.
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,0,0)
SU: Not update best state, Cost = 385390.90
SU: Starting iteration 5, state space = (2,3,4) : (0,1,1)
SU: Not update best state, Cost = 22208.92
SU: Starting iteration 6, state space = (2,3,4) : (0,1,0)
SU: Not update best state, Cost = 385004.97
SU: Starting iteration 7, state space = (2,3,4) : (0,0,1)
SU: Not update best state, Cost = 18244.64
SU: Starting iteration 8, state space = (2,3,4) : (0,0,0)
SU: Not update best state, Cost = 406160.14
SU: Will unnest subquery SUBQ3 (#2) --> (1,0,1) 이므로 서브쿼리블록 1과 3이 Unnesting되었다.
SU: Will not unnest subquery SUBQ2 (#3)
SU: Will unnest subquery SUBQ1 (#4)
SU: Reconstructing original query from best state. --> best state(Iteration 3)로부터 Original Query 재작성
{code}
* Exhaustive Type의 Iteration 횟수는 8(서브쿼리가 3개이므로 2의 3승)이다.
{code:SQLtitle= 서브쿼리가 3개인 경우의 Trace 내용 2borderStyle=solid}
*****************************
Cost-Based Subquery Unnesting
*****************************
SU: Considering subquery unnest on query block MAIN (#1). --> 1번 (채번순서)MAIN 쿼리블럭
SU: Checking validity of unnesting subquery SUBQ1 (#4) --> 4번
SU: Passed validity checks, but requires costing.
SU: Checking validity of unnesting subquery SUBQ2 (#3) --> 3번
SU: Passed validity checks, but requires costing.
SU: Checking validity of unnesting subquery SUBQ3 (#2) --> 2번
SU: Passed validity checks, but requires costing.
SU: Using search type: exhaustive
{code}
* 시퀀스를 이용하여 일련번호를 채번하듯이 Logical Optimizer도 각 쿼리블럭을 채번했다.
* MAIN 쿼리블록은 1번이며 가장 아래에 있는 SUBQ3이 2번 SUBQ2가 3번 가장위에있는 SUBQ1이 4번이다.
{code:SQLtitle= 서브쿼리가 5개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = exhaustive
SU: Using search type: exhaustive
SU: Starting iteration 1, state space = (2,3,4,5,6) : (1,1,1,1,1)
SU: Updated best state, Cost = 1459.38
...중간생략
SU: Starting iteration 7, state space = (2,3,4,5,6) : (1,1,0,0,1)
SU: Updated best state, Cost = 1283.83
SU: Starting iteration 8, state space = (2,3,4,5,6) : (1,1,0,0,0)
...중간생략
SU: Starting iteration 32, state space = (2,3,4,5,6) : (0,0,0,0,0)
SU: Not update best state, Cost = 434282.61
SU: Will unnest subquery SUBQ5 (#2)
SU: Will unnest subquery SUBQ4 (#3)
SU: Will not 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}
* 이 Type을 선택하면 SQL이 실행되어 인덱스나 테이블을 Scan하는 시간보다 Hard Parsing 시간이 더 오래 걸릴 수도 있다.
{code:SQLtitle= 서브쿼리가 7개인 경우의 Trace 내용borderStyle=solid}
******************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = exhaustive
SU: Using search type: Two_Pass
...이후생략
{code}
* Search Type은 고정적이지 않고 상황에 따라 Cut-off한다.