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
둘 다 실행 계획을 확인한 후, 성능 최적화가 필요한 경우에만 사용하는 것이 좋음! 🚀
오늘은 AI 생태계에 혁신적인 변화를 가져올 것으로 예상되는 MCP(Model Context Protocol)에 대해 상세히 알아보겠습니다. 2024년…
1. TPM이란? TPM(Trusted Platform Module)은 국제 표준 기반의 보안 하드웨어 칩으로, 컴퓨터나 디지털 장비 내에서…
시즌2, 기대했는데... 실망도 두 배!두뇌싸움을 기대했는데, 전략도 없는 자기들만의 감정에 따른 편가르기, 정치싸움이 되어 버린…
BPF(Berkeley Packet Filter) 도어는 해커가 관리자 몰래 뒷문을 새로 만든 것입니다.해커가 명령을 내려 특정 데이터들을 뒷문을…
1. IPC의 개념과 목적 1.1 IPC란 무엇인가? IPC (Inter-Process Communication)는 운영체제 내의 서로 독립적인 프로세스…