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

정보보안기사 필기 핵심 개념, 접근통제·인증 8문제로 정리

필기 시험의 접근통제 영역은 용어 하나만 알아도 풀리는 문제와 개념을 뒤집어 묻는 문제가 섞여 나옵니다.…

3분 ago

유튜브 AI 영상 범람, 진짜 크리에이터는 어떻게 살아남나

유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…

1시간 ago

코스피 사이드카 이틀 만에 또 발동, 올해만 27번째…5분간 멈추는 건 ‘프로그램 매도’뿐입니다

이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…

2시간 ago

코스피 낙폭 7%로 확대, 외국인 1.7조 순매도: 10월 15일 오전 10시 시황

오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…

5시간 ago

코스피 5.59% 급락 출발, 개장 7분 만에 매도 사이드카: 10월 15일 오전 시황

10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…

5시간 ago

삼성 갤럭시 AI, 솔직히 기대 이하였다 — 실망스러운 이유 TOP 5

삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…

6시간 ago