{Tip}
View외부에 존재하는 Predicate를 view내부로 밀어 넣는 것으로, view를 구성하는 Query Block을 좀더 효과적으로 Optimization할 수 있다.
View Merging과 Predicate Pushing은 대단히 상호 보완적인 구성이다.{Tip}
Simple Predicate Pushing 은 Simple View Mersing과 대칭이다.
◈ Simple Predicate Pushing의 동작여부는 임의로 제어할 수 없는것으로 보인다.
> NO_PUSH_PRED HINT와 \_PRED_MOVE_AROUND Parameter값을 false로 주어도 동작한다.
결론 : Oracle은 가능한 모든 경우 Simple 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에서 추가된 것이다.
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의 사용을 하지 않을 수 없는것이 현실이다.