티스토리 뷰

DB

[DB] Join 순서 Driving Table, Driven Table

snail voyager 2025. 5. 6. 19:37
728x90
반응형

 

  • SQL을 실행할 때, 어떤 테이블을 먼저 읽고(드라이빙 테이블, Driving Table), 어떤 테이블을 나중에 조회(드라이븐 테이블, Driven Table)할지에 따라 실행 속도가 달라집니다.
  • 특히 Nested Loop Join에서는 조인 순서가 직접적인 성능에 큰 영향을 줍니다.
  • 옵티마이저는 기본적으로 조인 순서를 자동으로 결정합니다.
    단, SQL 문에 힌트가 없을 경우입니다. 힌트나 통계 정보가 있다면 그것을 기반으로 옵티마이저가 판단을 조정할 수 있습니다.

조인 순서가 중요한 이유

 

  1. 드라이빙 테이블(Driving Table)의 선택이 실행 속도를 좌우함
    • 드라이빙 테이블의 크기가 작을수록 성능이 좋아짐.
    • 작은 테이블을 먼저 읽고, 그 결과를 기반으로 큰 테이블을 조회하면 Index Lookup을 최소화할 수 있음.
  2. 대량 데이터 조인에서 Hash Join, Sort Merge Join이 사용될 때도 조인 순서가 성능에 영향을 미침
    • Hash Join에서는 작은 테이블을 해시 테이블로 만들어야 하므로 작은 테이블이 먼저 선택되는 것이 유리
    • Sort Merge Join에서도 조인 순서에 따라 정렬 비용이 다를 수 있음.

 

Oracle 드라이빙 테이블 강제하는 방법

Oracle에서 조인 순서를 강제하고 싶다면 LEADING 힌트를 사용

SELECT /*+ LEADING(A) */ A.*, B.*
FROM TableA A
JOIN TableB B ON A.id = B.id
WHERE A.status = 'active';

 

MySQL의 조인 순서 결정 방식

MySQL은 optimizer_switch='join_order' 설정에 따라 자동으로 조인 순서를 결정합니다.

  1. 옵티마이저가 비용 기반으로 조인 순서를 선택 (MySQL 8.0부터 개선됨)
  2. STRAIGHT_JOIN 또는 JOIN ORDER HINT를 사용하면 조인 순서를 강제 가능

MySQL에서 조인 순서 강제하는 방법

MySQL에서는 STRAIGHT_JOIN을 사용하면 옵티마이저의 자동 조인 순서 선택을 무시하고, FROM 절의 순서를 그대로 적용

SELECT /*+ SET_VAR(join_order=ON) */ A.*, B.*
FROM SmallTable B
STRAIGHT_JOIN LargeTable A ON A.id = B.id
WHERE B.status = 'active';

또는 (MySQL 8.0 이상):

SELECT /*+ JOIN_ORDER(B, A) */ A.*, B.*
FROM SmallTable B
JOIN LargeTable A ON A.id = B.id
WHERE B.status = 'Y';

 

728x90
반응형

'DB' 카테고리의 다른 글

[DB] INNER JOIN vs EXISTS  (0) 2025.05.06
[Oracle] 물리적 조인 (Physical Join)  (0) 2025.05.06
[MySQL] JSON 조회 JSON_TABLE  (0) 2025.04.29
[MySQL] JSON 조회 JSON_EXTRACT  (1) 2023.12.06
Pessimistic Lock vs Optimistic Lock  (0) 2022.09.05
반응형
300x250