📌 개요
**서브쿼리(Subquery)**는 쿼리 안에 포함된 또 다른 쿼리를 의미합니다.
SQL에서 복잡한 데이터를 조회하거나 특정 조건을 만족하는 데이터를 추출할 때 유용하지만,
성능 저하, 유지보수 어려움, 최적화 문제 등의 부작용을 초래할 수 있습니다.
💡 서브쿼리는 왜 문제가 될까?
➡️ 불필요한 연산 증가 → 쿼리 실행 속도 저하
➡️ 인덱스 활용 저하 → 데이터베이스 성능 악화
➡️ 가독성 저하 → SQL 코드 유지보수 어려움
📌 목차
- 서브쿼리란?
- 서브쿼리가 일으키는 주요 문제점
- 서브쿼리로 인한 성능 저하 사례
- 서브쿼리 대신 사용할 수 있는 대안 (JOIN, WITH, INDEX)
- 서브쿼리를 최적화하는 방법
- 결론
1. 서브쿼리란?
**서브쿼리(Subquery)**는 SQL 문 내에서 또 다른 SQL 문을 포함하는 중첩된 쿼리입니다.
🔹 서브쿼리 예제
<sql>SELECT name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'IT'
);
departments
테이블에서 IT 부서의 ID를 가져오는 서브쿼리를 실행한 후,- 해당 department_id를 이용하여 employees 테이블에서 직원 정보를 조회.
💡 문제는 이 서브쿼리가 불필요한 성능 저하를 유발할 수 있다는 점입니다.
2. 서브쿼리가 일으키는 주요 문제점
🔹 1) 성능 저하 (쿼리 실행 속도 문제)
- 서브쿼리는 메인쿼리마다 반복적으로 실행될 가능성이 있음.
- WHERE 절, SELECT 절, FROM 절에서 서브쿼리를 사용할 경우, 비효율적인 데이터 검색이 발생할 수 있음.
🔹 2) 인덱스(Index) 활용 저하
- 서브쿼리는 일반적으로 임시 테이블을 생성하여 데이터를 처리하는 경우가 많음.
- 이로 인해 데이터베이스가 기존 인덱스를 제대로 활용하지 못하고, 풀 테이블 스캔(Full Table Scan)이 발생할 가능성이 높음.
🔹 3) 중첩된 서브쿼리로 인해 가독성 저하
- 서브쿼리가 너무 많아지면, SQL 코드가 읽기 어렵고 유지보수가 힘들어짐.
- 쿼리 실행 흐름을 파악하기 어려워져, 디버깅이 복잡해짐.
🔹 4) 데이터베이스 부하 증가
- 비효율적인 서브쿼리 사용은 데이터베이스 리소스를 과다 사용하여,
다중 사용자 환경에서 응답 시간이 길어지는 문제를 일으킬 수 있음.
3. 서브쿼리로 인한 성능 저하 사례
🔹 1) 단순한 서브쿼리가 비효율적인 경우
<sql>SELECT name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
- 이 서브쿼리는 전체 직원 테이블에서 최대 급여를 찾기 위해 전체 데이터를 스캔해야 함.
- 더 나은 대안: ORDER BY + LIMIT 사용.
<sql>SELECT name
FROM employees
ORDER BY salary DESC
LIMIT 1;
💡 이 방법은 전체 테이블을 반복적으로 조회하지 않고, 정렬 후 첫 번째 행만 반환하기 때문에 더 빠름!
🔹 2) WHERE 절에서 서브쿼리를 사용할 경우
<sql>SELECT name, salary
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'Seoul'
);
- 해당 서브쿼리는
departments
테이블을 조회한 후, 각 결과를 employees 테이블과 비교해야 함. - 비효율적인 방법이며, 인덱스가 있어도 제대로 활용되지 않을 가능성이 있음.
✅ 더 나은 대안: JOIN
사용
<sql>SELECT e.name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location = 'Seoul';
💡 JOIN을 사용하면 서브쿼리보다 효율적이며, 인덱스를 활용할 수 있음!
4. 서브쿼리를 대체할 수 있는 대안
대안 방법 | 설명 |
---|---|
JOIN | 서브쿼리를 사용하지 않고, 직접적으로 테이블을 연결 |
WITH (CTE) | 가독성을 높이면서도 성능을 유지할 수 있는 방법 |
인덱스 최적화 | 적절한 인덱스를 활용하여 성능 개선 |
5. 서브쿼리를 최적화하는 방법
🔹 1) JOIN
을 활용하여 성능 개선
<sql>SELECT e.name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location = 'Seoul';
✅ JOIN을 사용하면 중첩된 서브쿼리를 제거하여 성능을 크게 개선할 수 있음!
🔹 2) WITH (CTE, Common Table Expression)
사용
<sql>WITH dept AS (
SELECT department_id FROM departments WHERE location = 'Seoul'
)
SELECT e.name, e.salary
FROM employees e
JOIN dept d ON e.department_id = d.department_id;
✅ CTE(Common Table Expression)를 사용하면 가독성이 향상되고 최적화가 용이함.
🔹 3) 적절한 인덱스 추가
<sql>CREATE INDEX idx_department_id ON employees(department_id);
CREATE INDEX idx_location ON departments(location);
✅ 인덱스를 활용하면 데이터 검색 속도를 획기적으로 향상시킬 수 있음!
6. 결론
🔹 서브쿼리는 언제 사용해야 할까?
✅ 단순한 서브쿼리는 가독성이 좋을 수 있지만, 성능이 중요한 경우 JOIN 또는 CTE로 대체하는 것이 좋다.
✅ 반복 실행이 많은 서브쿼리는 성능 저하를 일으킬 수 있으므로, 인덱스를 활용하거나 JOIN으로 변경하는 것이 유리하다.
✅ 데이터베이스에서 서브쿼리를 사용할 때는 실행 계획(EXPLAIN)을 활용하여 성능을 분석하는 것이 중요하다.
🚀 최적의 SQL 쿼리를 사용하여 성능을 높이고, 유지보수를 쉽게 할 수 있도록 주의하세요! 😊