본문 바로가기
Spring

JOIN종류 / ON절의 의미 / Query 조회기능 최적화 팁

by 리승우 2022. 11. 7.

[참조사이트]

https://jaenjoy.tistory.com/7

https://superman28.tistory.com/23

[JOIN 종류]

예제 테이블

mysql> select * from demo_people;
name phone  pid 
 Mr brown  01225 708225  1
 Miss Smith  01225 899360  2
 Mr Pullen  01380 724040  3

 

mysql> select * from demo_property;
pid spid selling 
 1  1  Old House Fram
 3  2  The Willows
 3  3  Tali Trees
 3  4  the Melksham Florist
 4  5  Dun Roamin

 

 

1. 기본 JOIN (= INNER JOIN)

  - 기본적으로 JOIN은 교집합이다.

 

2. LEFT JOIN

OUTER JOIN에는 두 가지 요소가 있다.

1. OUTER JOIN의 기준이 되는 테이블
2. OUTER JOIN의 기준이 아닌 테이블

본 쿼리에서 기준 테이블은 demo_people이고 기준이 아닌 테이블은 demo_property이다.

demo_people를 기준으로 demo_property를 확장해라는 뜻이다.

 

 - 왼쪽 테이블을 중심으로 오른쪽의 테이블을 매치시킨다.

 - 왼쪽 테이블의 한개의 레코드에 여러개의 오른쪽 테이블 레코드가 일치할 경우, 
   해당 왼쪽 레코드를 여러번 표시하게 된다.

 - 왼쪽은 무조건 표시하고, 매치되는 레코드가 오른쪽에 없으면 NULL을 표시한다.

 

[ ON절의 의미]

ON절의 용도

1. 조인 대상 필터링

2. 연관 고나계없는 엔티티 외부조인

 

ON에 조건을 거는 것은 애초에 시작이 다르다.

간단한 예시로 ON절에 조건을 주면, 테이블을 합칠 때 조건이 걸려서 하나의 가상테이블(join된 결과)이 만들어진다.

그와 반대로 WHERE절에 조건이 걸리면, 다 만들어진 테이블을 다시 훑으면서 해당 조건에 맞는 결과물을 반환한다.

이는 OUTER JOIN에서 확연하게 차이를 보인다.

 

결론 : 조인 테이블에 대한 조건은 WHERE보다 ON을 통해서 필터링하는 것이 성능을 최적화할 수 있는 방법이다.

 

이유 : ON을 사용할 경우 테이블들이 조인되기 전에 조건문을 수행한다. 반면에 WHERE 절은 테이블들이 조인된 후에

조건문이 수행되기에 더 많은 데이터를 필터링해야한다. 그러므로 성능을 저하시킬 수 있다.

 

※참고사항

> on은 outer join에 속한다 (공통되는 컬럼이 아니여도 같이 조인된다)

 

> Inner Join의 경우 ON, Where 성능 차이는 크게 없으나, Outer Join의 데이터가 많으면 많을수록 큰 효과를 볼 수 있다.

(inner Join은 애초에 매핑된 값을 가져오기에, on을 하든 where를 하든 성능/조회상 차이가없다)

 

> outer Join의 경우, on절을 사용할 시 테이블이 조인되기 전에 조건문을 수행하여 기존에 가져와야할 모든 정보가 아닌, 필터링되어 추려진 정보만을 갖고온 채 조인하게되어 효율이 상승한다. (이는 outer join 데이터가 많을 수록 효과가크다)

 

[Query 조회기능 최적화 팁]

Join 되는 결과 테이블의 크기를 줄여야 한다.
=> JOIN시 on절에 의해 추려지는 데이터는 메모리에서 관리하게 되므로, on으로 추릴 때 이왕이면 데이터의 중복이나, 양을 최대한 줄일 수 있도록 설정해야 성능에 도움이 된다.
=>그래서 Left outer join 보다는 inner join을 사용하자


같은 데이터를 뽑아낼 거면 Left outer join으로 null로 join 되는 걸 가져온 후 다시 제외하는 것보다,
한 번에 inner join을 사용하는 게 성능상 좋다.

'Spring' 카테고리의 다른 글

Querydsl 관련정보  (0) 2022.11.21
페치조인 (Fetch Join)  (0) 2022.11.07
Elasticsearch란? (작성중)  (0) 2022.11.05
ExceptionHandler / ControllerAdvice 사용법  (0) 2022.11.03
WebSocket / STOMP  (1) 2022.10.28

댓글