본문 바로가기

SQL & 데이터베이스/SQL 기본 문법 & 오류

[SQL] SQL 조인(JOIN) 최적화 기법과 성능

[SQL] SQL 조인(JOIN) 최적화 기법과 성능 고려 사항

1. JOIN이란?

SQL에서 JOIN은 두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 연산입니다.

데이터베이스 설계에서 **정규화(Normalization)** 가 적용되면,

여러 개의 테이블로 데이터가 분리되므로, 데이터를 효과적으로 조회하려면 조인이 필수적입니다.

2. JOIN의 종류

JOIN 유형 설명 예제
INNER JOIN 두 테이블에서 공통된 데이터만 반환 SELECT * FROM A INNER JOIN B ON A.id = B.id;
LEFT JOIN 왼쪽 테이블의 모든 행 + 일치하는 오른쪽 테이블의 행 반환 SELECT * FROM A LEFT JOIN B ON A.id = B.id;
RIGHT JOIN 오른쪽 테이블의 모든 행 + 일치하는 왼쪽 테이블의 행 반환 SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
FULL JOIN 양쪽 테이블의 모든 데이터를 반환 (NULL 포함) SELECT * FROM A FULL JOIN B ON A.id = B.id;

3. JOIN의 성능 최적화 기법

  • ✔ **JOIN에 사용되는 컬럼은 반드시 INDEX를 생성**하여 성능을 최적화해야 합니다.
  • ✔ 테이블 크기가 클 경우, **WHERE 조건을 먼저 적용**하여 불필요한 데이터 조회를 줄입니다.
  • ✔ **SELECT * 사용 지양** → 필요한 컬럼만 조회하여 성능 향상
  • ✔ **JOIN 순서를 최적화** → 드라이빙 테이블(작은 테이블)이 먼저 스캔되도록 조정

4. JOIN 성능 비교 예제

🔹 **비효율적인 JOIN 예제** (전체 테이블을 조회 후 조인)


SELECT * 
FROM employees e 
INNER JOIN departments d 
ON e.dept_id = d.dept_id;

✅ **문제점:** - employees와 departments 테이블의 모든 데이터를 가져온 후 조인을 수행하여 **성능 저하 발생**

🔹 **최적화된 JOIN 예제** (INDEX 활용 및 WHERE 조건 추가)


SELECT e.name, d.department_name
FROM employees e 
INNER JOIN departments d 
ON e.dept_id = d.dept_id
WHERE e.status = 'ACTIVE';

✅ **개선점:** - **WHERE 조건을 먼저 적용**하여 불필요한 데이터를 줄임 - **INDEX를 활용**하여 검색 속도 향상

5. INDEX와 JOIN의 관계

JOIN을 실행할 때, **JOIN에 사용되는 컬럼이 INDEX로 설정되지 않으면 성능 저하**가 발생할 수 있습니다.

🔹 **INDEX가 없는 경우 (느린 실행)**


EXPLAIN ANALYZE
SELECT e.name, d.department_name
FROM employees e 
INNER JOIN departments d 
ON e.dept_id = d.dept_id;

✅ 결과: **"Using temporary; Using filesort"** 표시 → 성능 저하 발생 가능

🔹 **INDEX 추가 후 성능 개선**


CREATE INDEX idx_dept_id ON employees(dept_id);

✅ **INDEX 생성 후 실행하면 성능 향상**

📌 정리

  • ✔ SQL JOIN은 데이터를 연결하는 필수 개념이며, INNER, LEFT, RIGHT, FULL JOIN이 있음
  • ✔ 성능 최적화를 위해 **INDEX를 활용하고 WHERE 조건을 먼저 적용**
  • ✔ **필요한 컬럼만 조회**하여 불필요한 데이터 처리를 줄이는 것이 중요
  • ✔ EXPLAIN PLAN을 활용하여 **실행 계획을 확인하고 최적화 가능**

🔗 다른 SQL 최적화 관련 글도 함께 확인해보세요!

SQL 실행 계획(EXPLAIN PLAN) 분석 및 최적화 방법