Predicat Pushing

{Tip}
View외부에 존재하는 Predicate를 view내부로 밀어 넣는 것으로, view를 구성하는 Query Block을 좀더 효과적으로 Optimization할 수 있다.
View Merging과 Predicate Pushing은 대단히 상호 보완적인 구성이다.{Tip}

|Simple Predicate Pushing|

Simple Predicate Pushing 은  Simple View Mersing과 대칭이다.

◈ Simple Predicate Pushing의 동작여부는 임의로 제어할 수 없는것으로 보인다.

> NO_PUSH_PRED HINT와 \_PRED_MOVE_AROUND Parameter값을 false로 주어도 동작한다.

결론 : Oracle은 가능한 모든 경우 Simple Predicate Pushing을 시도하며 대부분의 경우 긍정적인 개선효과를 얻을 수 있다.

|Join Predicate Pushing|

JoinPredicate Pushing 은  Complex View Mersing과 대칭이다.

Union all Operation 으로 인해 Veiw Mersing을 실패하지만 Join Predicate Pushing으로 인해 효율적인 Index Range Scan과 Nested Loops Join을 사용하는 실행계획을 볼 수 있다. UNION-ALL PARTITION 이라는 새로운 이름의 Operation이 등장하는데 이것은 10g에서 추가된 것이다.

|Non-Pushable Predicate|

Predicate Pushing이 항상 가능한 것은 아니다.

Predicate Pushing이 실패할때

1. ROWNUM Operation이 사용된 경우

2. UNION ALL 등 set Operation이 존재하는 경우(되는 경우도 있고 그렇지 않은 경우도 있음.)

\* PUSH_PRED Hint를 사용해서 강제로 수행할 수 있지만 오히려 비효율적인 경우도 발생함.

\* Hint로 제어 가능한 경우는 Heuristic또는 COST계산에 의해 Oracle이 능동적으로 Predicate Pushing을 수행하는 경우 뿐이다.

3. Analytic Function이 View에 사용된 경우

4. Bitmap Index로 변경된 경우

\* USE_NL Hint를 부여하면 Predicate Pushing이 이루어진다.

\정리 : 실행계획을 보고 어떤 단계에서 어떤 종류의 변형이 발생했는지를 파악하는 해석능력이 있어야 한다.*
           오라클에게 맡기려면 통계정보가 정확해야 하며, Oracle이 Cost계산이 현실적일 때만 의미가 있다.
           적절한 Hint의 사용을 하지 않을 수 없는것이 현실이다.

문서에 대하여