[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 & 데이터베이스 > SQL 기본 문법 & 오류' 카테고리의 다른 글
[SQL 기본 문법 & 오류] ORA-00904: "Invalid Identifier" 오류 원인과 해결법 (0) | 2025.03.19 |
---|---|
[SQL] SQL 조인(JOIN) 최적화 기법과 성능 고려 사항 (0) | 2025.03.15 |
[SQL 기본 문법 & 오류] SQL DELETE 쿼리 사용법 및 주의점 (0) | 2025.03.14 |
[SQL] VIEW(뷰) 개념과 활용 방법 - 성능 최적화 및 관리 팁 (0) | 2025.03.13 |
[SQL] 서브쿼리(Subquery) 개념 및 활용 방법 (3) | 2025.03.12 |