DB

[SQL] JOIN의 종류와 각 JOIN의 성능차이

0and24 2024. 12. 16. 14:16

데이터베이스를 다루다 보면, 여러 테이블에서 데이터를 가져와야 할 때가 있습니다. 이때 사용하는 것이 JOIN입니다. 하지만 JOIN의 종류에 따라 처리 방식이 다르고, 성능에도 영향을 미칠 수 있습니다. 이번 글에서는 SQL JOIN의 종류와 성능 차이에 대해 알아보겠습니다

1. SQL JOIN의 종류

https://theartofpostgresql.com/blog/2019-09-sql-joins/

1) INNER JOIN

  • 정의: 두 테이블 간의 공통값이 있는 행만 반환합니다.
  • 특징: 조건에 맞는 데이터만 반환하므로 불필요한 데이터가 적습니다.
SELECT A.col1, B.col2
FROM TableA A
INNER JOIN TableB B
ON A.id = B.id;
  • id 값이 일치하는 행만 결과에 나옵니다.

2) LEFT JOIN (또는 LEFT OUTER JOIN)

  • 정의: 왼쪽 테이블의 모든 행을 반환하며, 오른쪽 테이블에 일치하는 값이 없으면 NULL로 채웁니다.
  • 특징: 왼쪽 테이블이 기준입니다.
SELECT A.col1, B.col2
FROM TableA A
LEFT JOIN TableB B
ON A.id = B.id;
  • 왼쪽 테이블의 모든 행이 표시되며, 오른쪽에 일치하는 데이터가 없으면 NULL이 나옵니다.

3) RIGHT JOIN (또는 RIGHT OUTER JOIN)

  • 정의: 오른쪽 테이블의 모든 행을 반환하며, 왼쪽 테이블에 일치하는 값이 없으면 NULL로 채웁니다.
  • 특징: 오른쪽 테이블이 기준입니다.
SELECT A.col1, B.col2
FROM TableA A
RIGHT JOIN TableB B
ON A.id = B.id;
  • 오른쪽 테이블의 모든 행이 결과에 포함되고, 왼쪽 테이블에 일치하는 값이 없으면 NULL이 나옵니다.

4) FULL JOIN (또는 FULL OUTER JOIN)

  • 정의: 두 테이블의 모든 데이터를 반환하며, 일치하지 않는 값은 NULL로 채웁니다.
  • 특징: 두 테이블 모두 스캔해야 하므로 비용이 큽니다.
SELECT A.col1, B.col2
FROM TableA A
FULL JOIN TableB B
ON A.id = B.id;
  • 두 테이블 모두 일치하지 않는 데이터도 결과에 포함됩니다.

5) CROSS JOIN

  • 정의: 두 테이블의 모든 행을 조합합니다.
  • 특징: 행 수가 기하급수적으로 증가하므로 주의해야 합니다.
SELECT A.col1, B.col2
FROM TableA A
CROSS JOIN TableB B;
  • 모든 가능한 행의 조합이 결과로 나타납니다.

6) SELF JOIN

  • 정의: 같은 테이블을 조인하여 자신과 비교하는 데 사용됩니다.
  • 특징: 계층적 데이터나 특정 조건을 비교할 때 유용합니다.
SELECT A.col1, B.col1
FROM TableA A
JOIN TableA B
ON A.parent_id = B.id;
  • 같은 테이블에서 데이터를 서로 연결해 가져옵니다.


2. JOIN별 성능 차이와 이유

  1. INNER JOIN
    • 인덱스가 설정된 컬럼을 기준으로 일치하는 데이터를 빠르게 찾습니다.
    • 가장 일반적이며, 인덱스 사용 시 성능 개선 효과가 큽니다.
  2. LEFT/RIGHT OUTER JOIN
    • 왼쪽 또는 오른쪽 테이블의 모든 행을 가져오므로 인덱스를 활용하면 일치하는 데이터를 빠르게 찾을 수 있습니다.
    • 단, 인덱스는 NULL 값 처리에는 도움을 주지 않기 때문에 추가 연산이 발생할 수 있습니다.
    • 그렇기 때문에 데이터를 많이 조회하는 테이블을 JOIN 기준 테이블로 삼으면 성능이 개선될 수 있습니다.
  3. FULL OUTER JOIN
    • 양쪽 테이블의 모든 데이터를 가져오기 때문에 인덱스를 사용해도 성능 개선 효과는 상대적으로 적습니다.
    • 인덱스 + 필터링 조건이 있을 때 효과가 더 큽니다.
  4. CROSS JOIN
    • 모든 행의 조합을 만드는 조인이기 때문에 인덱스가 직접적으로 도움을 주지는 않습니다.
    • WHERE 절로 데이터를 제한해야 성능을 개선할 수 있습니다.
  5. SELF JOIN
    • 같은 테이블을 여러 번 읽기 때문에 인덱스를 잘 설정하면 성능이 크게 개선됩니다.

3. JOIN 성능 최적화를 위한 팁

  1. 인덱스 활용: 조인에 사용되는 컬럼에 인덱스를 생성하면 검색 속도가 크게 향상됩니다.
  2. 필요한 데이터만 가져오기: SELECT 구문에서 필요한 컬럼만 명시하세요.
  3. 조인 순서 최적화: 데이터 크기가 작은 테이블을 먼저 조인하면 메모리 사용량이 줄어듭니다.
  4. 실행 계획 확인: EXPLAIN 명령어를 사용해 실행 계획을 확인하고, 비효율적인 부분을 개선합니다.

 

이전에  JOIN이 많아지면 성능이 저하될 수 있다는 이야기를 듣고, JOIN 사용을 최소화하며 프로젝트를 진행했던 경험이 있습니다. 하지만 오늘 공부하면서 느낀 점은, JOIN 자체가 문제라기보다는 무분별한 사용적절한 최적화 부족이 성능 저하의 주요 원인이라는 점입니다.

 

참고 자료:
https://theartofpostgresql.com/blog/2019-09-sql-joins/

 

What is an SQL JOIN?

The book that teaches SQL to developers: Learn to replace thousands of lines of code with simple queries!

theartofpostgresql.com

https://www.atlassian.com/data/sql/sql-join-types-explained-visually

 

Visualizing SQL Joins | Atlassian

Learn the ins and outs of different join types in SQL and how they can be used to effectively merge datasets with our comprehensive guide and cheat sheet.

www.atlassian.com