4.9 State Space란 무엇인가?

  • State Space란 Iteration 횟수가 늘어날 때마다 Library Cache 내에 변경된 SQL 정보, 변경된 실행계획정보를 저장하는 공간이다.
{panel:title= State Space 구조도}
  • Library Cache => State Space(Search Space)
    1. 각각의 Iteration은 새로운 Query Transformation을 발생시키고 변경된 SQL은 각각 T1,T2...TN에 저장된다.
    (1,1),(1,0),(0,1),(0,0)은 Query State Space 내부의 T1,T2,T3,T4에 각각 저장된다.
    2. T1,T2 ... TN에 대응하는 SQL의 실행계획(Plan)은 Plan State Space 내부의 P1,P2 ... PN에 각각저장된다.
    3. Iteration과정을 마치게 되면 최저 Cost를 가지는 Iteration의 Plan과 SQL이 최종적으로 선택된다.
    최종결과물이 Q1(Query), BP1(Best Plan)이다.
{code:SQLtitle= 서브쿼리가 3개인 경우의 Trace 내용borderStyle=solid}
*************************************
PARAMETERS WITH ALTERED VALUES
******************************
_optimizer_cost_based_transformation = on
SU: Using search type: exhaustive
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,0)
SU: Not update best state, Cost = 385405.50
SU: Starting iteration 3, state space = (2,3,4) : (1,0,1)
SU: updated best state, Cost = 1425.02
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)
SU: Will not unnest subquery SUBQ2 (#3)
SU: Will unnest subquery SUBQ1 (#4)
SU: Reconstructing original query from best state.
{code}
각 Iiteration마다 State Space가 사용되었다.

Library Cache가 아니라 State Space이다.

  • 오라클은 왜 State Space라는 용어를 사용할까?
    각 Iteration마다 발생하는 Transformation의 상태정보(변경된 SQL, 변경된 Plan, 변경된 SQL에 의한 Cost 등)를 저장하는 공간이기 때문.

State Space가 중요한 이유?

최저 Cost에 해당하지 않는 State정보, 그이외의 State정보가 나중에도 필요하다.
ex)
CSU관점에서는 (1,0)이 최저 Cost라고 가정한다면 CSU이후에 수행되는 CVM(Complex View Merging)이나
JPPD(Join Predicate Push Down)관점에서는 전혀 결과가 다를 수 있다.
즉 CSU 단계에서는 (1,0)이 최저 Cost 이지만 CVM 단계에서는 CSU(1,1)+CVM을 적용한 SQL이 최저 Cost가 될 수 있다.
따라서 최저 Cost에 해당하는 State 뿐만 아니라 모든 Iteration의 State를 저장해야 한다. 4.12, 4.13장 자세히 설명