OPTIMIZER COST BASED TRANSFORMATION

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Parameter 정보


Syntax _OPTIMIZER_COST_BASED_TRANSFORMATION = ON|LINEAR|OFF
설정방법
  • Parameter File
  • ALTER SYSTEM SET "_OPTIMIZER_COST_BASED_TRANSFORMATION" = ON
  • ALTER SESSION SET "_OPTIMIZER_COST_BASED_TRANSFORMATION" = ON
버전 및 기본값
9iR2 10gR1 10gR2 11g
- ON ON ON



[편집] 설명

Subquery Unnesting이나 View Merging 등의 Query Transformation을 Cost based로 수행할 지의 여부를 지정한다. Cost Based Query Transformation은 10g에서 소개된 개념으로 기본값은 항상 True이다. Oracle 9i까지는 Oracle은 가능한 항상 Query Transformation을 시도한다. 하지만 10g부터는 비용(Cost)를 고려하여 Subquery UnnestingView Merging이 비용을 줄이는데 도움이 될 때만 수행한다.


[편집] 참고 사항

[편집] 실행 계획 이상과 Cost Based Transformation

9i 버전에서 정상적으로 Subquery Unnesting이나 View Merging이 이루어지는 쿼리가 10g에서는 변환이 발생하지 않을 수 있다. 통계 정보가 정확하다면 오라클의 대부분의 경우 최적의 판단을 하지만, 간혹 특정 쿼리의 경우에는 변환이 이루어지지 않음으로써 비효율적인 실행 계획으로 바뀔 수 있다. 이런 경우에는 _OPTIMIZER_COST_BASED_TRANSFORMATION 파라미터 값을 OFF로 변경하거나 OPT_PARAM 힌트를 이용해서 해당 파라미터를 Statement 레벨에서 변경해야 한다.

alter session set _optimizer_cost_based_transformation = off;

-- 혹은

select /*+ opt_param('_optimizer_cost_based_transformation', 'off') */ ...

[편집] 10053 Trace와 Cost Based Transformation

10gR2부터는 10053 Trace에 Query Transformation 과정이 상세히 기록된다. 따라서 Cost Base Transformation 과정 또한 10053 Trace를 이용해 Troubleshooting이 가능해졌다. 10053 Trace File에서의 Query Transformation 디버깅 예는 다음과 같다.

SELECT /*+ */ "T3"."C1" "C1","T4"."C2" "C2",COUNT(*) "CNT" FROM "UKJA"."T3" "T3","UKJA"."T4" "T4" WHERE "T3"."C1"="T4"."C1" GROUP BY "T3"."C1","T4"."C2"
Query block (04C7F7C8) unchanged
CVM:     CVM bypassed: Outer QB referencing ROWNUM

SELECT /*+ */ "T2"."C1" "C1","X"."C2" "C2","X"."CNT" "CNT",ROWNUM "R" FROM "UKJA"."T2" "T2", (SELECT /*+ */ "T3"."C1" "C1","T4"."C2" "C2",COUNT(*) "CNT" FROM "UKJA"."T3" "T3","UKJA"."T4" "T4" WHERE "T3"."C1"="T4"."C1" GROUP BY "T3"."C1","T4"."C2") "X" WHERE "T2"."C1"="X"."C1"
Query block (04C7FE60) unchanged
CVM:     CVM bypassed: ROWNUM column

PM: Considering predicate move-around in SEL$1 (#1).
PM:   Checking validity of predicate move-around in SEL$1 (#1).
PM:     PM bypassed: Reference to ROWNUM.
PM:   Passed validity checks.

위의 예에서는 ROWNUM에 의해 CVM(Complex View Merging)과 PM(Predicate Move-Around)가 이루어지 이 않았음을 알 수 있다.

[편집] 관련된 정보

  1. MERGE 힌트
  2. NO_UNNEST 힌트
  3. NO_MERGE 힌트
  4. NO_QUERY_TRANSFORMATION 힌트
  5. UNNEST 힌트
  6. _OPTIMIZER_PUSH_PRED_COST_BASED 파라미터

[편집] 외부 참조