Optimizing Oracle Optimizer (2009년)
Predicate Pushing 0 0 97,198

by 구루비스터디 Transformation Predicate Pushing [2018.07.14]


Predicat Pushing


  • 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계산이 현실적일 때만 의미가 있다.
  • 적절한 Hint의 사용을 하지 않을 수 없는것이 현실이다.
"데이터베이스 스터디모임" 에서 2009년에 "OPTIMIZING ORACLE OPTIMIZER " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3880

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입