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둘 다 실행 계획을 확인한 후, 성능 최적화가 필요한 경우에만 사용하는 것이 좋음! 🚀
1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…