happy-developers / dev-interview

1 stars 1 forks source link

[DB] 다중 테이블 조회 시 조인 순서가 성능에 영향을 끼칠까요? 만약 그렇다면 어떤 경우이고, 왜 그럴까요? #41

Open leeho1110 opened 1 year ago

leeho1110 commented 1 year ago

다중 테이블 조회 시 조인 순서가 성능에 영향을 끼칠까요? 만약 그렇다면 어떤 경우이고, 왜 그럴까요?

키워드

Nested Loop Join, Driving table(Outer table), Driven Table

leeho1110 commented 1 year ago

Nested Loop Join

DBMS는 여러 테이블을 엮을 수 있도록 Nested Loop Join, Sorted Merget Join, Hash Join 등 다양한 조인 알고리즘을 제공합니다. 그 중 2개 이상의 테이블에서 행들을 모두 확인해 조인하는 Nested Loop Join(하위 NL Join)에 대해서 알아보시죠. Nested(중첩된) Loop(반복)이라는 이름에서도 유추해볼 수 있듯 반복의 기준이 되는 테이블을 잘 선택하는 것이 중요합니다.


Driving Table, Driven Table

NL Join 방식에선 실행 계획에 의해 먼저 접근되어 Access Path를 주도하는 테이블을 Driving Table(옵티마이저가 결정) 이라고 부르며, 이 후 액세스되는 테이블을 Driven Table이라고 합니다. 이 때 Driving Table의 선택이 성능에 큰 영향을 미치게 되는데 이는 NL Join의 동작 방식 때문입니다.

NL Join은 Driving Table의 처리 범위 내에서 조건을 만족하는 행을 탐색한 뒤, 찾은 데이터를 통해 Driven Table을 탐색하며 조인 결과를 추출합니다. 즉 조인 시 먼저 접근하는 Driving Table의 조건을 만족하는 로우 수가 많으면 그만큼 Driven Table에 접근하는 횟수가 늘어나게 됩니다.


성능에 영향을 끼치는 요소와 상황

이해하기 쉽게 조회 대상 테이블을 2개라고 가정했을 때 고려할 수 있는 조건과 예상 동작은 아래 4가지입니다.

결국 다중 테이블을 조회하는 경우 인덱스가 있다는 가정 하에 로우 수가 적은 테이블을 Driving Table로, (비교하고자 하는 컬럼에) 인덱스가 존재하는 테이블을 Driven Table로 선택되는 것이 가장 좋은 성능을 발휘합니다.

제목으로 인해 단순히 쿼리 작성 시 나열되는 테이블 순서로 오해하실수도 있어 남깁니다. Driving, Driven Table은 내부적으로 옵티마이저가 선택하기 때문에 작성 순서에 따른 성능 변화는 없습니다.


참고자료