178. 조건 푸시 다운 (Condition Pushdown)
핵심 인사이트: 쓰레기를 집 밖으로 다 가지고 나와서 마당에서 분리수거(조인 후 필터링)를 할 필요가 없다. 집 안(서브쿼리 내부)에서 미리 분리수거를 싹 끝내고 가벼운 봉투만 들고 나오면, 마당(메인 쿼리)에서 처리할 데이터가 확 줄어들어 쿼리가 빛의 속도로 날아다닌다.
Ⅰ. 조건 푸시 다운(Condition Pushdown)의 개념
옵티마이저가 쿼리를 최적화할 때, 메인 쿼리의 WHERE 절에 있는 필터링 조건(Condition)을 인라인 뷰(Inline View)나 서브쿼리 내부로 쑥 밀어 넣어서(Pushdown), 데이터를 조인하거나 집계하기 전에 미리 데이터를 걸러내는(Early Filtering) 강력한 쿼리 변환(Query Transformation) 기술입니다.
Ⅱ. 조건 푸시 다운의 동작 원리
[ 개발자가 작성한 쿼리 (서브쿼리 안에는 필터 조건이 없음) ]
SELECT A.부서명, V.사원명, V.급여
FROM 부서 A,
(SELECT 부서번호, 사원명, 급여 FROM 사원) V -- ◀ 전체 사원(100만 명)을 다 읽음
WHERE A.부서번호 = V.부서번호
AND A.부서명 = 'IT개발부'; -- ◀ 메인 쿼리에만 조건이 있음
▼ (옵티마이저의 조건 푸시 다운 적용) ▼
[ 내부적으로 변환되어 실행되는 쿼리 ]
SELECT A.부서명, V.사원명, V.급여
FROM 부서 A,
(SELECT 부서번호, 사원명, 급여
FROM 사원
WHERE 부서번호 IN (SELECT 부서번호 FROM 부서 WHERE 부서명 = 'IT개발부')
-- ◀ 메인 쿼리의 조건이 서브쿼리 안으로 파고 들어옴!
) V
WHERE A.부서번호 = V.부서번호;
Ⅲ. 조건 푸시 다운이 가져오는 마법 같은 효과
- I/O 및 메모리 감소: 서브쿼리에서 테이블 전체(Full Scan)를 읽어 거대한 임시 집합을 만들지 않고, 뷰 내부에서 인덱스를 타서 소량의 데이터만 미리 뽑아냅니다.
- 조인 부하 최소화: 서브쿼리가 반환하는 결과 건수(Row)가 100만 건에서 10건으로 줄어들면, 이후 메인 쿼리와 조인할 때 발생하는 조인 횟수(Loop) 자체가 기하급수적으로 줄어듭니다.
Ⅳ. 집계 연산(GROUP BY)에서의 조건 푸시 다운
조인뿐만 아니라 GROUP BY가 포함된 뷰에서도 매우 유용합니다.
SELECT * FROM (SELECT 부서, SUM(급여) FROM 사원 GROUP BY 부서) WHERE 부서 = 'A'- 옵티마이저는 뷰 내부로 조건을 밀어 넣어, 전체 부서를 그룹핑하지 않고 오직 'A' 부서만 미리 그룹핑하도록 실행 계획을 바꿔버립니다.
📢 섹션 요약 비유: 수만 명의 학생 중 '1학년 3반' 학생들만 체육복 사이즈 조사를 하려 할 때, 전교생을 운동장에 다 모아놓고 반을 확인한 뒤 골라내는 것(Pushdown 안 됨)이 아니라, 애초에 방송으로 "1학년 3반만 교실에서 사이즈 적어서 반장만 내려와라"(Pushdown)라고 지시하는 효율적인 행정 처리입니다.