데이터베이스를 다루다 보면, 여러 테이블에서 데이터를 가져와야 할 때가 있습니다. 이때 사용하는 것이 JOIN입니다. 하지만 JOIN의 종류에 따라 처리 방식이 다르고, 성능에도 영향을 미칠 수 있습니다. 이번 글에서는 SQL JOIN의 종류와 성능 차이에 대해 알아보겠습니다
1. SQL JOIN의 종류
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별 성능 차이와 이유
- INNER JOIN
- 인덱스가 설정된 컬럼을 기준으로 일치하는 데이터를 빠르게 찾습니다.
- 가장 일반적이며, 인덱스 사용 시 성능 개선 효과가 큽니다.
- LEFT/RIGHT OUTER JOIN
- 왼쪽 또는 오른쪽 테이블의 모든 행을 가져오므로 인덱스를 활용하면 일치하는 데이터를 빠르게 찾을 수 있습니다.
- 단, 인덱스는 NULL 값 처리에는 도움을 주지 않기 때문에 추가 연산이 발생할 수 있습니다.
- 그렇기 때문에 데이터를 많이 조회하는 테이블을 JOIN 기준 테이블로 삼으면 성능이 개선될 수 있습니다.
- FULL OUTER JOIN
- 양쪽 테이블의 모든 데이터를 가져오기 때문에 인덱스를 사용해도 성능 개선 효과는 상대적으로 적습니다.
- 인덱스 + 필터링 조건이 있을 때 효과가 더 큽니다.
- CROSS JOIN
- 모든 행의 조합을 만드는 조인이기 때문에 인덱스가 직접적으로 도움을 주지는 않습니다.
- WHERE 절로 데이터를 제한해야 성능을 개선할 수 있습니다.
- SELF JOIN
- 같은 테이블을 여러 번 읽기 때문에 인덱스를 잘 설정하면 성능이 크게 개선됩니다.
3. JOIN 성능 최적화를 위한 팁
- 인덱스 활용: 조인에 사용되는 컬럼에 인덱스를 생성하면 검색 속도가 크게 향상됩니다.
- 필요한 데이터만 가져오기: SELECT 구문에서 필요한 컬럼만 명시하세요.
- 조인 순서 최적화: 데이터 크기가 작은 테이블을 먼저 조인하면 메모리 사용량이 줄어듭니다.
- 실행 계획 확인: 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
'DB' 카테고리의 다른 글
Redis란 무엇인가? (0) | 2024.11.26 |
---|---|
BASE와 NoSQL: ACID와의 차이점 및 선택 기준 (0) | 2024.11.25 |
데이터베이스 트랜잭션과 ACID: 안정성을 위한 4가지 원칙 (0) | 2024.11.25 |
RDBMS vs NoSQL: 차이점과 사용 이유는? (3) | 2024.11.23 |