Programming-[Backend]/SQL

[TIL] inner join, left join의 차이. 예시 및 성능, MSSQL Server Management Studio 실행 계획

컴퓨터 탐험가 찰리 2021. 11. 4. 15:54
728x90
반응형

 

차이점1. 데이터 조회량 차이

inner join과 left join의 기본적인 차이는 간단하다. 기준이 되는 from 테이블(driving table)과 조인해오는 테이블(inner table)이 있을 때, 외래키를 갖는 데이터만 불러올지, 외래키가 없더라도 모든 데이터를 driving table 기준으로 조회할지 결정하는 것이다.

 

orders 테이블의 member_id가 members 테이블의 id값과 외래키로 연결되어 있는 상태인데, '주인없는 주문'의 경우 member_id 값이 null이기 때문에 left join에서는 아래 그림처럼 null인 값도 포함하여 5개 행이 조회되지만, inner join으로 조회한다면 외래키가 없는 레코드(행)은 빠지게 되어 4개 행만 조회된다.

 

따라서 비즈니스 로직상 주인 없는 주문도 일단 다 불러와야하는 상황이라면 left join을, 연관관계가 있는 정보만 불러오고 싶다면 inner join을 해야한다. 물론, 연관관계가 없는 데이터는 들어가지 않도록 애초에 데이터베이스를 잘 설계하는 것이 중요하다.

 

다만 이것은 orders 테이블을 기준으로 했을 때의 경우이다. order의 행이 존재하는데 member가 지정안된 경우, 다시말해 1:N의 관계에서 N쪽 테이블을 기준으로 해야 결과의 차이가 발생한다. 숫자가 적은 members를 driving table로 지정한다면 inner join이나 left join이나 결과는 4행으로 조회되며 orders.id = 5 인 항목은 조회되지 않는다.

 

차이점2. 성능차이

 

만약 데이터베이스를 잘 설계해서, 반드시 외래키를 갖는, 연관관계를 갖는 데이터만 존재한다고 가정해보자. 그럼 inner join이든 left join이든 위 예제의 경우 4개 행만 가져올 것이다. 그러나 그런 경우일지라도, inner join을 적용하는 것이 유리할 수 있다.

 

쿼리문을 실행하면 데이터베이스에서 Optimizer에 의해 최적화되어 정보를 조회하게 되는데, 복잡한 알고리즘이 필요한 경우 대체로 inner join이 성능상 유리할 수 있기 때문이다. 정확한 내용은 아니지만, 굳이 결과가 같은 상황에서 left join을 해서 리스크를 질 필요는 없다.

(얼핏 듣기로는 inner join은 driving table만 메모리에 올린 뒤 inner table은 관계로만 찾고, left join은 두 테이블을 모두 메모리에 올리는 방식으로 들음)

 

좀 더 자세한 이해를 위해서 최적화 알고리즘을 간단하게나마 살펴보자. 이 최적화 알고리즘은 참조1.에서 참조한 내용으로, nested loop, hash, sort merge 등의 방법을 사용한다. 그중 대표적인 nested loop의 원리를 보면, 두 테이블을 이중 포문을 돌리듯이 outer loop, inner loop로 차례대로 스캔한다고 한다.

 

참조1. 의 TABLE A를 하나씩 검사하면서, TABLE A의 레코드 하나당 TABLE B의 모든 레코드를 검사하는 방식이다. 그런데 TABLE B의 레코드가 N개면 N개를 모두 검사하는 것이 아니라, TABLE B에 지정된 index 값을 바탕으로 그림에서 초록색, 빨간색 원으로 표시된 2개의 레코드만 검색하면 된다. (보통 테이블을 만들 때, 데이터를 바로 찾을 수 있도록 index값을 지정해준다)

 

이 경우 시간복잡도는 TABLE A의 데이터 갯수(M)과 TABLE B에서의 2개의 곱으로 2M(O(n))이 되어 높은 성능을 보여준다. 이렇게 되기 위한 전제조건이, 1) driving table(기준 테이블, TABLE A)의 레코드 수가 적은 쪽이여야 하고, 2) inner table(조인 해오는 테이블, TABLE B)의 외래키에 index가 존재해야 한다는 것이다.

참조1. nested loop 방식 원리 그림

 

MicroSoft SQL Server Management Studio 예상 실행계획

 

MSSQL, MSSQL Server Management Studio(2018)를 설치하고 테이블 및 데이터를 만든 뒤, 쿼리문을 실행할 때 아래 사진처럼 '예상 실행 계획 표시' 버튼을 누르면 실행 계획을 알려준다! 이는 데이터베이스가 어떤 방식을 사용하고, CPU나 메모리 등 어떤 종류의 자원을 얼마만큼 사용할 것인지 알려준다.

 

쿼리문의 성능을 개선해야할 때, 이런 지표들을 바탕으로 어떤 곳에서 문제가 있는지 분석할 수 있는 유용한 도구이다.

 


 

참조1. 코딩강아지 님의 블로그

https://m.blog.naver.com/jwyoon25/221288655539

 

참조2. 회사 동료분. 감사

 

728x90
반응형