OPTIMIZER TRANSITIVITY RETAIN

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 기본 정보

[편집] Parameter 정보


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



[편집] 설명

Transitive Closure에 의해 조인 조건이 없어지는 현상을 방지할 수의 여부를 지정한다. 즉, 이 값이 True이면 Transitive Closure가 발생하더라도 조인 조건은 없어지지 않는다.

Transitive Closure란 아래와 같이 Predicate를 이전(Transitivity)시켜서 불필요한 Predicate를 없애는 것을 의미한다.

select count(*) 
from t1, t2
where t1.c1 = t2.c1 and
      t1.n1 = 5
;
==> 위의 Query가 Transformation 과정을 통해 아래 Query로 변환된다.
select count(*) 
from t1, t2
where t1.n1 = 5 and
      t2.n1 = 5
;

Transitive Closure는 일반적으로 성능에 유리하지만, 조인 조건에 대해 적용될 때는 불리한 방향으로의 실행 계획 변화를 가져오기 때문에 10gR2부터는 기본적으로 조인 조건에 대해서는 Transitive Closure가 적용되지 않게끔 개선된 것이다.

[편집] 사용 예제

_OPTIMIZER_TRANSITIVITY_RETAIN 파라미터에 의한 실행 계획 변화는 다음과 같다.

-- Join 조건을 없애는 경우(10gR2 이전 버전에서 기본)
alter session set "_optimizer_transitivity_retain" = false;

explain plan for
select count(*)
from t1, t2
where 
  t1.c1 = t2.c1 and
  t1.c1 = 5
;
-------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)|
-------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |     1 |     6 |  4489   (3)|
|   1 |  SORT AGGREGATE       |      |     1 |     6 |            |
|   2 |   MERGE JOIN CARTESIAN|      |  1000K|  5859K|  4489   (3)|
|*  3 |    TABLE ACCESS FULL  | T1   |  1000 |  3000 |     6   (0)|
|   4 |    BUFFER SORT        |      |  1000 |  3000 |  4483   (3)|
|*  5 |     TABLE ACCESS FULL | T2   |  1000 |  3000 |     4   (0)|
-------------------------------------------------------------------
                                                                   
Predicate Information (identified by operation id): 
--------------------------------------------------- 
   3 - filter("T1"."C1"=5)                          
   5 - filter("T2"."C1"=5)   
 

-- 조인 조건을 없애지 않는 경우(10gR2부터 기본)
alter session set "_optimizer_transitivity_retain" = true;

explain plan for
select count(*)
from t1, t2
where 
  t1.c1 = t2.c1 and
  t1.c1 = 5
;
 -----------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |     6 |    13   (8)|
|   1 |  SORT AGGREGATE     |      |     1 |     6 |            |
|*  2 |   HASH JOIN         |      |   100K|   585K|    13   (8)|
|*  3 |    TABLE ACCESS FULL| T1   |  1000 |  3000 |     6   (0)|
|*  4 |    TABLE ACCESS FULL| T2   |  1000 |  3000 |     6   (0)|
-----------------------------------------------------------------
                                                                 
Predicate Information (identified by operation id):              
---------------------------------------------------              
   2 - access("T1"."C1"="T2"."C1")                               
   3 - filter("T1"."C1"=5)                                       
   4 - filter("T2"."C1"=5)                                 

10gR2 이전 버전에서 10gR2와 같은 효과를 얻으려면 다음과 같이 SQL 문장을 수정해야 한다.

explain plan for
select count(*)
from t1, t2
where 
  t1.c1 = t2.c1 and
  t1.c1 = 5 and
  t2.c1 = 5 ;  <-- 불필요한 Predicate를 추가한다.
-----------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |     1 |     6 |    13   (8)|
|   1 |  SORT AGGREGATE     |      |     1 |     6 |            |
|*  2 |   HASH JOIN         |      |   100K|   585K|    13   (8)|
|*  3 |    TABLE ACCESS FULL| T1   |  1000 |  3000 |     6   (0)|
|*  4 |    TABLE ACCESS FULL| T2   |  1000 |  3000 |     6   (0)|
-----------------------------------------------------------------
                                                                 
Predicate Information (identified by operation id):              
---------------------------------------------------              
   2 - access("T1"."C1"="T2"."C1")                               
   3 - filter("T1"."C1"=5)                                       
   4 - filter("T2"."C1"=5)         

[편집] 관련된 정보

[편집] 외부 참조