View외부에 존재하는 Predicate를 view내부로 밀어 넣는 것으로, view를 구성하는 Query Block을 좀더 효과적으로 Optimization할 수 있다.
View Merging과 Predicate Pushing은 대단히 상호 보완적인 구성이다.
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계산이 현실적일 때만 의미가 있다.