PUSH_SUBQ 힌트는 스칼라 서브쿼리의 실행 시점을 앞당겨서 실행 성능을 최적화할 때 사용됩니다.즉, 스칼라 서브쿼리(Scalar Subquery) 내부의 프레디케이트(Predicate)를 메인 쿼리로 푸시(Push)하는 것을 강제하는 힌트입니다.
SELECT e.empno, e.ename,
(SELECT /*+ PUSH_SUBQ */ d.dname
FROM dept d
WHERE d.deptno = e.deptno) AS department_name
FROM emp e
WHERE e.sal > 3000; 위 쿼리에서 PUSH_SUBQ 힌트를 사용하면, e.sal > 3000 조건이 메인 쿼리에서 적용된 후에 서브쿼리가 실행될 수 있도록 최적화됩니다.
PUSH_SUBQ 힌트를 사용하면 서브쿼리가 먼저 실행되므로, 특정 경우에는 예상보다 더 많은 데이터가 처리될 수도 있음.PUSH_PRED 사용)PUSH_PRED → 인라인 뷰(서브쿼리 테이블)에서 프레디케이트를 푸시할 때 사용.INLINE → 서브쿼리가 뷰로 변환되는 것을 방지하고 인라인 뷰로 유지하도록 강제할 때 사용.PUSH_PRED과 비교-- PUSH_PRED: 인라인 뷰에서 프레디케이트 푸시
SELECT /*+ PUSH_PRED */ *
FROM (
SELECT e.*, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno
) sub
WHERE sub.sal > 3000;
-- PUSH_SUBQ: 스칼라 서브쿼리에서 푸시
SELECT e.empno, e.ename,
(SELECT /*+ PUSH_SUBQ */ d.dname
FROM dept d
WHERE d.deptno = e.deptno) AS department_name
FROM emp e
WHERE e.sal > 3000; → PUSH_PRED는 인라인 뷰에 적용, PUSH_SUBQ는 스칼라 서브쿼리에 적용됨.
PUSH_SUBQ는 스칼라 서브쿼리의 실행 시점을 앞당겨 최적화할 때 사용.PUSH_PRED을 사용해야 함.PUSH_SUBQ vs. PUSH_PRED 차이점| 힌트 | 설명 | 적용 대상 | 실행 최적화 방식 |
|---|---|---|---|
PUSH_SUBQ | 스칼라 서브쿼리(Scalar Subquery)의 실행 시점을 앞당겨 성능 최적화 | SELECT 절의 서브쿼리 (스칼라 서브쿼리) | 서브쿼리를 메인 쿼리에서 먼저 실행하도록 강제 |
PUSH_PRED | 서브쿼리 내부로 프레디케이트(Predicate)를 푸시하여 불필요한 데이터 스캔을 줄임 | 인라인 뷰(Inline View) 또는 서브쿼리를 포함한 테이블 | WHERE 조건을 서브쿼리 내부로 푸시하여 필터링을 먼저 적용 |
PUSH_SUBQ 사용 예제 (스칼라 서브쿼리)SELECT e.empno, e.ename,
(SELECT /*+ PUSH_SUBQ */ d.dname
FROM dept d
WHERE d.deptno = e.deptno) AS department_name
FROM emp e
WHERE e.sal > 3000; PUSH_SUBQ를 사용하면, e.sal > 3000 조건이 먼저 적용된 후 SELECT 절의 서브쿼리가 실행됨.PUSH_PRED 사용 예제 (인라인 뷰)SELECT /*+ PUSH_PRED */ *
FROM (
SELECT e.*, d.dname
FROM emp e
JOIN dept d ON e.deptno = d.deptno
) sub
WHERE sub.sal > 3000; PUSH_PRED를 사용하면 sal > 3000 조건이 메인 쿼리가 아니라 서브쿼리 내부에서 먼저 적용됨.PUSH_SUBQ vs. PUSH_PRED 정리| 구분 | PUSH_SUBQ | PUSH_PRED |
|---|---|---|
| 적용 대상 | SELECT 절의 스칼라 서브쿼리 | FROM 절의 인라인 뷰 |
| 작동 방식 | 서브쿼리 실행을 앞당겨 메인 쿼리 필터 조건을 먼저 적용 | 서브쿼리 내부로 프레디케이트(Predicate)를 푸시하여 필터링을 먼저 적용 |
| 사용 목적 | 서브쿼리 실행 횟수를 줄여 불필요한 서브쿼리 호출을 줄임 | 서브쿼리 내부에서 먼저 필터링하여 불필요한 데이터 스캔을 줄임 |
| 적용 예제 | SELECT 절의 (SELECT ... FROM ...) | FROM 절의 (SELECT ... FROM ...) sub |
| 함께 사용 가능 힌트 | INLINE, UNNEST | INLINE, MERGE |
| 상황 | 추천 힌트 |
|---|---|
SELECT 절의 서브쿼리가 느려서 최적화가 필요할 때 | PUSH_SUBQ |
FROM 절의 서브쿼리가 WHERE 조건을 무시하고 너무 많은 데이터를 반환할 때 | PUSH_PRED |
PUSH_SUBQPUSH_PRED둘 다 실행 계획을 확인한 후, 성능 최적화가 필요한 경우에만 사용하는 것이 좋음! 🚀
유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…
이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…
오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…
10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…
삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…