Driving Table, Driven Table, Nested Loop Join

TopOfTheHead·2026년 2월 20일

데이터베이스

목록 보기
10/13

DBMS에서 JOIN을 수행 시 드라이빙 테이블드리븐 테이블로 구분되어 JOIN 연산이 수행
드라이빙테이블 : 드리븐 테이블 = 1:N

  • 드라이빙 테이블 ( Driving Table = Outer Table )
    SQL Query에서 JOIN 시 가장 먼저 ACCESS되어 Access Path를 주도하는 DB 테이블

    드라이빙 테이블통계정보인덱스를 기반으로 레코드 수가 적은 테이블을 우선으로 옵티마이저에 의해 결정
    FROM절테이블이 무조건 드라이빙 테이블은 아니다.

  • 드리븐 테이블 ( Driven Table = Inner Table )
    드라이빙 테이블의 결과를 기반으로 나중에 ACCESS되는 테이블

    Nested Roof Join드리븐 테이블에서는 조인 조건 컬럼에 대해 인덱스를 지정하여 비용을 감소시키는게 중요
    ▶ 되도록 내부 루프쿼리플랜 - type:REF로 지정되도록 인덱스를 설정

드라이빙 테이블 결정 조건
JOIN 시 어떤 테이블이 먼저 액세스 되어 드라이빙 테이블로 선정되었는지에 따라서 속도차이가 크게 발생할 수 있음

옵티마이저레코드 수인덱스에 따른 통계 정보를 기반으로 가장 비용이 낮은 테이블 조인 순서를 결정하여 쿼리 플랜을 결정

  • 레코드 수
    옵티마이저는 일반적으로 더 작은 테이블드라이빙 테이블로 선정

    JOIN 시 어떤 테이블이 먼저 액세스 되어 드라이빙 테이블로 선정되었는지에 따라서 속도차이가 크게 발생
    ex ) 테이블 A : 5000만 레코드, 테이블 B : 1000 레코드에서 AB를 조인 시

    테이블 A드라이빙 테이블인 경우
    Nested Loop join5000만 번을 반복하면서 B테이블을 탐색

    테이블 B드라이빙 테이블인 경우
    Nested Loop join1000 번을 반복하면서 A테이블을 탐색

    즉, 작업 대상이 되는 레코드수가 적은 테이블부터 액세스 되어 드라이빙 테이블로 선정되어야 외부 루프 수 감소.



  • 인덱스
    옵티마이저SQL QueryWHERE 또는 ON 조건절에서 사용한 인덱스 컬럼도 고려하여 드라이빙 테이블을 결정
    ex ) 인덱스 컬럼으로 조인드라이빙 테이블에서 한 레코드를 가져와서 내부 루프에서 드리븐 테이블에서 인덱스를 기반으로 빠르게 조회가능

예시
o 테이블 : 주문 테이블로서 보통 레코드가 많음.
o.member_idFK로서 FK 인덱스일 가능성이 높음

m 테이블 : 회원 테이블로서 주문 테이블에 비해 레코드가 상대적으로 적음

SELECT
    m.email as memberEmail,
    COUNT(*) as totalOrders,
    SUM(o.total_amount) as totalAmount,
    AVG(o.total_amount) as averageAmount
FROM
    ch3_orders o
JOIN
    ch2_members m
        ON o.member_id = m.id
GROUP BY
    m.email
HAVING
    SUM(o.total_amount) >= 100000
limit
    100

옵티마이저에 의해 m : Driving Table o : Driven Table로 설정될 가능성이 매우 높음.
외부 루프 수 감소 및 내부 루프에서 o.member_idFK 인덱스를 통해 조인 조건에 맞는 레코드 검색이 효율적으로 수행

Nested Loop Join
드라이빙 테이블에서 외부 루프로서 한 행씩 순차적으로 읽으면서, 각 행에 대해 드리븐 테이블에서 내부 루프로서 조인 조건에 맞는 레코드를 검색하여 조인하는 메카니즘
MySQL에서 테이블조인 시 가장 기본적인 메카니즘

드라이빙 테이블 각 행에 대해 내부 루프에서 조인 조건에 맞는 드리븐 테이블레코드를 검색 시 조인 조건 컬럼인덱스를 생성할 경우 쿼리플랜 type = REF를 통해 드리븐 테이블에 접근하여 매우 낮은 Cost로 원하는 레코드를 도출

  • 조인 과정
    드라이빙 테이블외부루프에서 각 에 대해 드리븐 테이블내부루프를 수행하여 조건 : ON 드리븐테이블.id = 드라이빙테이블.id를 만족하는 을 반환
FOR EACH row in 드라이빙 테이블 : 외부루프
    FOR EACH matching row in 드리븐 테이블 : 내부루프
        IF join-condition matches THEN 
            RETURN combined row
  • Nested Loop Join에서는 외부루프 수가 성능을 좌우
    Nested Loop Join에서는 드라이빙 테이블의 절대적인 레코드 수가 적어 외부루프 수가 적어야 전체 탐색이 감소하여 성능이 좋아짐.
  
profile
공부기록 블로그

0개의 댓글