PUSH_SUBQ 힌트는 스칼라 서브쿼리의 실행 시점을 앞당겨서 실행 성능을 최적화할 때 사용됩니다.즉, 스칼라 서브쿼리(Scalar Subquery) 내부의 프레디케이트(Predicate)를 메인 쿼리로 푸시(Push)하는 것을 강제하는 힌트입니다.

✅ 기본 사용법

위 쿼리에서 PUSH_SUBQ 힌트를 사용하면, e.sal > 3000 조건이 메인 쿼리에서 적용된 후에 서브쿼리가 실행될 수 있도록 최적화됩니다.

✅ 언제 사용해야 하나?

  • 스칼라 서브쿼리가 포함된 SQL에서 실행 성능을 향상시킬 때
  • 메인 쿼리의 필터 조건이 적용된 후 서브쿼리를 실행하는 것이 더 효율적일 때
  • 스칼라 서브쿼리가 여러 번 실행되는 것을 줄이고자 할 때

✅ 주의할 점

  • 옵티마이저가 자동으로 푸시할 수 있는 경우도 있으므로 실행 계획을 먼저 확인하는 것이 좋음.
  • PUSH_SUBQ 힌트를 사용하면 서브쿼리가 먼저 실행되므로, 특정 경우에는 예상보다 더 많은 데이터가 처리될 수도 있음.
  • 스칼라 서브쿼리가 아닌 인라인 뷰(서브쿼리 테이블) 에는 적용되지 않음. (이 경우 PUSH_PRED 사용)

✅ 함께 사용하면 좋은 힌트

  • PUSH_PRED인라인 뷰(서브쿼리 테이블)에서 프레디케이트를 푸시할 때 사용.
  • INLINE서브쿼리가 뷰로 변환되는 것을 방지하고 인라인 뷰로 유지하도록 강제할 때 사용.

🔹 예제: PUSH_PRED과 비교

PUSH_PRED인라인 뷰에 적용, PUSH_SUBQ스칼라 서브쿼리에 적용됨.

✅ 결론

  • PUSH_SUBQ스칼라 서브쿼리의 실행 시점을 앞당겨 최적화할 때 사용.
  • 메인 쿼리의 필터링이 먼저 적용된 후 서브쿼리가 실행되도록 하여 불필요한 서브쿼리 호출을 줄일 수 있음.
  • 인라인 뷰에는 적용되지 않으며, 인라인 뷰에는 PUSH_PRED을 사용해야 함.
  • 옵티마이저의 기본 동작과 충돌할 수 있으므로, 실행 계획(EXPLAIN PLAN) 확인 후 적용 여부를 결정하는 것이 좋음.

PUSH_SUBQ vs. PUSH_PRED 차이점

힌트설명적용 대상실행 최적화 방식
PUSH_SUBQ스칼라 서브쿼리(Scalar Subquery)의 실행 시점을 앞당겨 성능 최적화SELECT 절의 서브쿼리 (스칼라 서브쿼리)서브쿼리를 메인 쿼리에서 먼저 실행하도록 강제
PUSH_PRED서브쿼리 내부로 프레디케이트(Predicate)를 푸시하여 불필요한 데이터 스캔을 줄임인라인 뷰(Inline View) 또는 서브쿼리를 포함한 테이블WHERE 조건을 서브쿼리 내부로 푸시하여 필터링을 먼저 적용

🔹 차이점 이해하기 위한 예제

✅ 1. PUSH_SUBQ 사용 예제 (스칼라 서브쿼리)

  • PUSH_SUBQ를 사용하면, e.sal > 3000 조건이 먼저 적용된 후 SELECT 절의 서브쿼리가 실행됨.
  • 즉, 스칼라 서브쿼리의 실행 횟수를 줄여 성능 최적화.

✅ 2. PUSH_PRED 사용 예제 (인라인 뷰)

  • PUSH_PRED를 사용하면 sal > 3000 조건이 메인 쿼리가 아니라 서브쿼리 내부에서 먼저 적용됨.
  • 즉, 불필요한 데이터가 조인되기 전에 필터링이 되어 최적화.

🔹 PUSH_SUBQ vs. PUSH_PRED 정리

구분PUSH_SUBQPUSH_PRED
적용 대상SELECT 절의 스칼라 서브쿼리FROM 절의 인라인 뷰
작동 방식서브쿼리 실행을 앞당겨 메인 쿼리 필터 조건을 먼저 적용서브쿼리 내부로 프레디케이트(Predicate)를 푸시하여 필터링을 먼저 적용
사용 목적서브쿼리 실행 횟수를 줄여 불필요한 서브쿼리 호출을 줄임서브쿼리 내부에서 먼저 필터링하여 불필요한 데이터 스캔을 줄임
적용 예제SELECT 절의 (SELECT ... FROM ...)FROM 절의 (SELECT ... FROM ...) sub
함께 사용 가능 힌트INLINE, UNNESTINLINE, MERGE

✅ 언제 어떤 힌트를 써야 할까?

상황추천 힌트
SELECT 절의 서브쿼리가 느려서 최적화가 필요할 때PUSH_SUBQ
FROM 절의 서브쿼리가 WHERE 조건을 무시하고 너무 많은 데이터를 반환할 때PUSH_PRED

🔹 결론

  1. PUSH_SUBQ
    스칼라 서브쿼리(SELECT 절의 서브쿼리)를 메인 쿼리에서 먼저 실행하도록 강제
    → 서브쿼리 호출 횟수를 줄이는 데 유용
  2. PUSH_PRED
    인라인 뷰(FROM 절의 서브쿼리) 내부에서 프레디케이트를 미리 적용하도록 강제
    → 불필요한 데이터 스캔을 줄이고 성능을 최적화하는 데 유용

둘 다 실행 계획을 확인한 후, 성능 최적화가 필요한 경우에만 사용하는 것이 좋음! 🚀

zerg96

Recent Posts

요양원 선택 전 반드시 확인해야 할 것들, 부모님 맡기기 전에 보세요

요양원 선택 전 반드시 확인해야 할 체크리스트를 공개합니다. 공식 평가 자료 조회법, 방문 시 확인…

2일 ago

공공기관 채용 비리, 내부에서 터져나온 충격 증언

공공기관 채용 비리의 실태와 피해 지원자의 대응법을 정리했습니다. 채용 비리 신고 방법, 공익신고자 보호제도, 취준생…

2일 ago

주식 손실 났을 때 세금 줄이는 방법, 아는 사람만 씁니다

주식 손실을 세금 절약에 활용하는 합법적 방법을 공개합니다. 해외주식 손익통산, ISA 계좌 활용, 연금계좌 절세까지…

2일 ago

음식 배달 늦으면 소비자가 취소할 수 있다, 몰랐던 권리

배달이 예상 시간보다 크게 늦으면 취소·환불을 요청할 수 있습니다. 배달앱별 지연 취소 방법과 잘못 배달됐을…

2일 ago

휴대폰 요금제 바꾸면 연 수십만원 절약, 지금 내 요금제 확인하세요

통신비 절약의 핵심은 요금제 최적화입니다. 내 데이터 사용량 확인법, 알뜰폰 전환 비교, 위약금 없이 요금제…

2일 ago

퇴직금 못 받았다면, 지금 당장 이렇게 하세요

퇴직 후 퇴직금을 받지 못했다면 즉시 노동부에 신고하세요. 지급 기한, 자격 요건, 신고 방법, 소액체당금…

2일 ago