Oracle PUSH_PRED 힌트

PUSH_PRED 힌트는 메인 쿼리의 WHERE 조건을 서브쿼리 내부로 밀어넣어 서브쿼리에 대한 프레디케이트 푸시다운(Predicate Pushdown) 을 강제하는 힌트입니다. 특정 상황에서는 실행 성능을 최적화할 수 있습니다.

✅ 기본 사용법

위와 같은 구조에서 PUSH_PRED 힌트를 사용하면 sub.sal > 3000 조건이 서브쿼리 내부로 밀려들어가 조인 이후가 아니라 조인 전에 필터링될 가능성이 커집니다.

✅ 언제 사용해야 하나?

  • 인라인 뷰(서브쿼리)가 포함된 SQL에서 WHERE 조건이 서브쿼리 내부에서 먼저 적용될 때 성능이 좋아질 경우
  • 불필요한 데이터 스캔을 줄이기 위해 서브쿼리 내부에서 미리 필터링할 때
  • 서브쿼리가 복잡한 조인을 포함하는 경우, 먼저 필터링하는 것이 효율적일 때

✅ 주의할 점

  • PUSH_PRED가 항상 성능을 향상시키는 것은 아닙니다. 경우에 따라서는 오히려 최적화된 실행 계획을 방해할 수도 있음.
  • Oracle 옵티마이저는 기본적으로 서브쿼리 내 프레디케이트를 자동으로 푸시할 수 있으므로, 강제할 필요가 없는 경우도 있음.

✅ 함께 사용하면 좋은 힌트

  • PUSH_SUBQ
    → 서브쿼리를 INLINE VIEW가 아닌 SCALAR SUBQUERY 형태로 변경하면서 프레디케이트를 푸시할 때 유용함.
  • INLINE
    → 옵티마이저가 서브쿼리를 뷰로 처리하는 것을 방지하고, 인라인 뷰로 유지하도록 강제.

이런 힌트를 조합하면 옵티마이저가 서브쿼리를 최적화하는 방식에 영향을 줄 수 있습니다.

결론:

  • PUSH_PRED는 서브쿼리 내에서 WHERE 조건을 미리 적용하여 불필요한 데이터 스캔을 줄이는 데 유용함.
  • 옵티마이저가 자동으로 적용하는 경우가 많으므로, 실행 계획 확인 후 성능 향상이 필요한 경우에만 사용하는 것이 좋음.
  • 특정 케이스에서는 PUSH_SUBQ, INLINE 힌트와 함께 사용하면 더 효과적일 수 있음.

Leave a Comment