175. 드라이빙 테이블 (Driving Table) vs 드리븐 테이블 (Driven Table)

핵심 인사이트: 조인의 성능을 결정짓는 절대 원칙은 "누구를 먼저 읽을 것인가?"다. 먼저 읽어서 전체 반복(Loop) 횟수를 확 줄여주는 테이블이 조인의 운전대(Driving)를 잡아야 하고, 끌려다니는 테이블(Driven)은 반드시 고속도로(인덱스)가 뚫려 있어야 한다.

Ⅰ. 드라이빙 테이블과 드리븐 테이블의 개념

데이터베이스에서 두 개 이상의 테이블을 조인(특히 중첩 루프 조인, NL Join)할 때, 옵티마이저가 가장 먼저 읽기로 결정한 테이블을 선행 테이블(Driving Table)이라 하고, 그다음으로 읽히며 조인되는 테이블을 후행 테이블(Driven Table)이라고 합니다.

Ⅱ. 핵심 역할 및 특징 비교

구분드라이빙 테이블 (Driving Table / Outer Table)드리븐 테이블 (Driven Table / Inner Table)
역할조인의 시작점. 여기서 추출된 행의 수만큼 전체 조인의 반복 횟수(Loop)가 결정됩니다.드라이빙 테이블의 결과값과 조인 키를 매칭하기 위해 반복적으로 탐색을 당하는 대상입니다.
최적화 조건WHERE 절의 조건(Selectivity)이 매우 좋아 최종 추출되는 데이터 건수가 가장 적은 테이블이어야 합니다.반복 탐색의 속도를 높이기 위해 조인 컬럼에 반드시 인덱스(Index) 가 존재해야 합니다.

Ⅲ. 조인 순서에 따른 성능 차이 예시

  • 상황: 회원(A) 테이블(1만 건)과 주문(B) 테이블(100만 건)을 조인합니다. 조건은 "이름이 '홍길동'인 회원의 주문 내역 조회"입니다. ('홍길동'은 1명)
[ ❌ 잘못된 조인 (B가 드라이빙) ]
1. 주문(B) 테이블 100만 건을 먼저 쫙 읽음 (Loop 100만 번 발생)
2. 각 주문의 회원번호를 가지고 회원(A) 테이블에서 '홍길동'인지 검사함
➔ 100만 번의 비효율적인 조인 탐색 발생!

[ ✅ 올바른 조인 (A가 드라이빙) ]
1. 회원(A) 테이블에서 이름이 '홍길동'인 사람 1명을 먼저 찾음 (Loop 1번 발생)
2. 그 1명의 회원번호를 가지고 주문(B) 테이블의 [회원번호 인덱스]를 찔러 주문 내역 추출
➔ 단 1번의 조인 탐색으로 초고속 응답!

Ⅳ. 옵티마이저의 조인 순서 결정과 힌트(Hint)

데이터베이스의 비용 기반 옵티마이저(CBO)는 테이블의 통계 정보(행 수, 인덱스 여부)를 바탕으로 가장 비용이 적은 테이블을 자동으로 드라이빙 테이블로 선택합니다. 그러나 통계가 부정확하여 옵티마이저가 바보 같은 선택을 할 경우, 개발자가 옵티마이저 힌트(Hint) 를 사용하여 조인 순서를 강제할 수 있습니다.

  • Oracle 힌트 예시: /*+ LEADING(A B) */ (A를 드라이빙 테이블로 사용해라)

📢 섹션 요약 비유: 모래사장에서 바늘 찾기를 할 때, 모래알을 하나씩 집어서 바늘인지 확인(큰 테이블 먼저 읽기)하는 것이 아니라, 자석(강력한 필터 조건)을 먼저 쓱 훑어서(드라이빙 테이블) 쇳조각 몇 개만 추려낸 뒤 그중에서 바늘인지 확인(드리븐 테이블)하는 것이 성능의 핵심입니다.