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.부서번호;

Ⅲ. 조건 푸시 다운이 가져오는 마법 같은 효과

  1. I/O 및 메모리 감소: 서브쿼리에서 테이블 전체(Full Scan)를 읽어 거대한 임시 집합을 만들지 않고, 뷰 내부에서 인덱스를 타서 소량의 데이터만 미리 뽑아냅니다.
  2. 조인 부하 최소화: 서브쿼리가 반환하는 결과 건수(Row)가 100만 건에서 10건으로 줄어들면, 이후 메인 쿼리와 조인할 때 발생하는 조인 횟수(Loop) 자체가 기하급수적으로 줄어듭니다.

Ⅳ. 집계 연산(GROUP BY)에서의 조건 푸시 다운

조인뿐만 아니라 GROUP BY가 포함된 뷰에서도 매우 유용합니다.

  • SELECT * FROM (SELECT 부서, SUM(급여) FROM 사원 GROUP BY 부서) WHERE 부서 = 'A'
  • 옵티마이저는 뷰 내부로 조건을 밀어 넣어, 전체 부서를 그룹핑하지 않고 오직 'A' 부서만 미리 그룹핑하도록 실행 계획을 바꿔버립니다.

📢 섹션 요약 비유: 수만 명의 학생 중 '1학년 3반' 학생들만 체육복 사이즈 조사를 하려 할 때, 전교생을 운동장에 다 모아놓고 반을 확인한 뒤 골라내는 것(Pushdown 안 됨)이 아니라, 애초에 방송으로 "1학년 3반만 교실에서 사이즈 적어서 반장만 내려와라"(Pushdown)라고 지시하는 효율적인 행정 처리입니다.