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_SUBQ
PUSH_PRED
둘 다 실행 계획을 확인한 후, 성능 최적화가 필요한 경우에만 사용하는 것이 좋음! 🚀
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…