본문 바로가기

SQL/MySQL

서브 쿼리(SUBQUERY)

1. 서브 쿼리란?

서브쿼리란 SQL 문장 내에서 다른 SQL 문장을 내포하는 쿼리를 말한다. 한 SQL 문장이 실행될 때, 내부적으로 다른 SQL 문장이 먼저 실행되고, 그 결과를 바탕으로 외부 SQL 문장이 실행되는 방식으로 작동한다.

 

2. 서브 쿼리와 성능의 상관관계

서브쿼리는 데이터를 필터링, 정렬, 집계하는데 유용하고 복잡한 데이터 관계 해결에도 쓰이는 강력한 도구이지만, 성능에 상당한 영향을 미칠 수 있음에 유의해야 한다.

 

서브쿼리로 인한 성능 저하를 개선하는 방법으로는 무엇이 있을까?

  • 조인으로 대체 : 조인으로 대체가 가능한 경우라면 서브쿼리 대신 조인을 사용하는 것이 좋다. 조인은 데이터베이스가 더 효율적으로 처리할 수 있는 보다 최적화된 방법이 될 수 있다.
  • 인덱스 활용 : 서브쿼리와 메인 쿼리 모두에서 중요 컬럼에 대한 인덱스를 생성하여 데이터 접근 속도를 높인다.
  • 서브쿼리 최소화 : 필요한 경우에만 서브쿼리를 사용하고, 가능하면 단일 쿼리로 문제 해결을 시도하는 편이 좋다. 또한, 단일 행을 반환하는 서브쿼리는 다중 행 서브쿼리보다 성능에 부정적인 영향을 덜 미치므로 보다 선호하는 방법이 될 수 있다.
  • 쿼리 리팩토링 : 복잡한 서브쿼리를 더 간단한 여러 쿼리로 분할하거나, 서브쿼리 대신 임시 테이블을 사용하는 등 쿼리를 재구성하여 성능을 개선할 수 있다.

여기서, 서브쿼리 대신 조인을 사용하여 성능을 개선하는 예시를 살펴보자.

  • 서브쿼리 사용 예시
// 각 직원의 급여가 해당 직원 부서 평균 급여보다 큰 경우를 확인하는 경우
SELECT A.employee_name, A.salary
FROM employees A
WHERE A.salary > (
	SELECT AVG(salary)
    FROM employees
    WHERE department_id=A.department_id
);

 

  • 조인을 사용하여 개선한 예시
SELECT A.employee_name, A.salary
FROM employees A
INNER JOIN (
	SELECT department_id, AVG(salary) as avg_salary
    FROM employees
    GROUP BY department_id
) B
ON A.department_id=B.department_id
WHERE A.salary > B.avg_salary;

 

해당 방식은 데이터베이스가 두 테이블 간의 조인 최적화를 가능하게 한다. 특히 'employees' 테이블에 적절한 인덱스가 있다면, 이 쿼리는 서브쿼리를 사용하는 방식보다 훨씬 효율적으로 실행될 수 있다. 조인을 사용하면 데이터베이스가 한 번에 더 많은 정보를 처리할 수 있으므로, 쿼리 실행 시간이 단축되는 경우가 많다.

'SQL > MySQL' 카테고리의 다른 글

MySQL 메모 및 Tip  (0) 2024.03.24