OPTIMIZER TRANSITIVITY RETAIN
EXEM Knowledge Base
목차 |
[편집] 기본 정보
[편집] Parameter 정보
| Syntax | _OPTIMIZER_TRANSITIVITY_RETAIN = TRUE|FALSE |
| 설정방법 |
|
| 버전 및 기본값 |
| 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)