PUSH_PRED
힌트는 메인 쿼리의 WHERE 조건을 서브쿼리 내부로 밀어넣어 서브쿼리에 대한 프레디케이트 푸시다운(Predicate Pushdown) 을 강제하는 힌트입니다. 특정 상황에서는 실행 성능을 최적화할 수 있습니다.
✅ 기본 사용법
SELECT /*+ PUSH_PRED */ *
FROM (
SELECT emp.*, dept.dname
FROM emp
JOIN dept ON emp.deptno = dept.deptno
) sub
WHERE sub.sal > 3000;
위와 같은 구조에서 PUSH_PRED
힌트를 사용하면 sub.sal > 3000
조건이 서브쿼리 내부로 밀려들어가 조인 이후가 아니라 조인 전에 필터링될 가능성이 커집니다.
✅ 언제 사용해야 하나?
- 인라인 뷰(서브쿼리)가 포함된 SQL에서 WHERE 조건이 서브쿼리 내부에서 먼저 적용될 때 성능이 좋아질 경우
- 불필요한 데이터 스캔을 줄이기 위해 서브쿼리 내부에서 미리 필터링할 때
- 서브쿼리가 복잡한 조인을 포함하는 경우, 먼저 필터링하는 것이 효율적일 때
✅ 주의할 점
PUSH_PRED
가 항상 성능을 향상시키는 것은 아닙니다. 경우에 따라서는 오히려 최적화된 실행 계획을 방해할 수도 있음.- Oracle 옵티마이저는 기본적으로 서브쿼리 내 프레디케이트를 자동으로 푸시할 수 있으므로, 강제할 필요가 없는 경우도 있음.
✅ 함께 사용하면 좋은 힌트
PUSH_SUBQ
→ 서브쿼리를 INLINE VIEW가 아닌 SCALAR SUBQUERY 형태로 변경하면서 프레디케이트를 푸시할 때 유용함.INLINE
→ 옵티마이저가 서브쿼리를 뷰로 처리하는 것을 방지하고, 인라인 뷰로 유지하도록 강제.
SELECT /*+ INLINE PUSH_PRED */ *
FROM (
SELECT emp.*, dept.dname
FROM emp
JOIN dept ON emp.deptno = dept.deptno
) sub
WHERE sub.sal > 3000;
이런 힌트를 조합하면 옵티마이저가 서브쿼리를 최적화하는 방식에 영향을 줄 수 있습니다.
결론:
PUSH_PRED
는 서브쿼리 내에서 WHERE 조건을 미리 적용하여 불필요한 데이터 스캔을 줄이는 데 유용함.- 옵티마이저가 자동으로 적용하는 경우가 많으므로, 실행 계획 확인 후 성능 향상이 필요한 경우에만 사용하는 것이 좋음.
- 특정 케이스에서는
PUSH_SUBQ
,INLINE
힌트와 함께 사용하면 더 효과적일 수 있음.