카테고리 없음
CTE, 서브쿼리, HAVING 절 비교: 가독성과 성능 측면에서의 차이
99duuk
2024. 9. 5. 15:11
데이터베이스 쿼리에서 결과는 동일하지만 방식이 다른 세 가지 방법이 있음.
CTE(WITH ... AS), 서브쿼리, 그리고 HAVING 절을 사용한 쿼리 방식임.
여기서는 가독성, 재사용성, 그리고 성능 측면에서 각 방식이 어떻게 다른지,
데이터가 많을 때와 적을 때 성능 차이가 어떻게 나는지 알아볼 것임.
1. CTE (WITH ... AS) 사용
CTE는 쿼리를 단계별로 나누어 작성할 수 있어서 가독성이 좋음. 중간 결과를 임시 테이블처럼 사용하기 때문에 재사용성도 높음.
WITH RecentSales AS (
SELECT employee_id, SUM(sales) AS total_sales
FROM sales_table
WHERE sale_date > '2024-01-01'
GROUP BY employee_id
)
SELECT employee_id, total_sales
FROM RecentSales
WHERE total_sales > 1000;
장점:
- 가독성: 복잡한 쿼리를 논리적으로 나누어 쉽게 이해할 수 있음.
- 재사용성: 한 번 작성한 CTE를 여러 곳에서 재사용 가능함.
단점:
- 성능: MySQL에서는 CTE가 비물질화되어 대량 데이터에서 성능 저하 발생할 수 있음. 특히 CTE가 여러 번 참조되면 매번 다시 계산될 가능성 있음.
2. 서브쿼리 사용
서브쿼리는 쿼리 내에서 중첩된 형태로 사용되며, 한 번만 사용될 필터링이나 계산을 처리할 때 유용함. 하지만 가독성은 떨어질 수 있음.
SELECT employee_id, total_sales
FROM (
SELECT employee_id, SUM(sales) AS total_sales
FROM sales_table
WHERE sale_date > '2024-01-01'
GROUP BY employee_id
) AS sales_summary
WHERE total_sales > 1000;
장점:
- 성능: 경우에 따라 CTE보다 성능이 좋을 수 있음. 서브쿼리는 한 번 계산되면 그 결과가 다시 재평가되지 않기 때문에 대량 데이터에서도 유리할 수 있음.
단점:
- 가독성: 중첩된 서브쿼리는 이해하기 어려울 수 있음.
- 재사용성: 한 번 정의한 서브쿼리를 다른 곳에서 재사용할 수 없어서 재사용성 떨어짐.
3. HAVING 절 사용
HAVING 절은 그룹화된 결과를 필터링할 때 사용됨. 가장 간단한 쿼리 구조로 직관적이지만, 복잡한 로직을 처리할 때 가독성이 떨어질 수 있음.
SELECT employee_id, SUM(sales) AS total_sales
FROM sales_table
WHERE sale_date > '2024-01-01'
GROUP BY employee_id
HAVING SUM(sales) > 1000;
장점:
- 성능: 필터링과 집계를 한 번에 처리하므로 성능이 가장 좋을 수 있음. 중간 결과를 여러 번 저장하지 않고 바로 처리됨.
단점:
- 가독성: 간단한 쿼리에서는 가독성이 좋지만, 복잡해지면 가독성이 떨어질 수 있음.
- 재사용성: 중간 결과를 저장하거나 다른 곳에서 참조할 수 없기 때문에 재사용성 낮음.
가독성, 재사용성, 성능 비교
가독성
- CTE(WITH ... AS)가 가장 가독성이 좋음. 논리적으로 쿼리를 나누어 쉽게 이해 가능.
- HAVING 절은 간단한 쿼리일 경우 가독성이 좋지만, 복잡해질수록 불리함.
- 서브쿼리는 중첩될수록 가독성 떨어짐.
재사용성
- CTE가 가장 재사용성이 높음. 한 번 정의한 결과를 여러 번 참조 가능.
- 서브쿼리와 HAVING 절은 재사용성이 떨어져서 반복해서 작성해야 함.
성능
- HAVING 절이 가장 성능상 이점을 가질 수 있음. 필터링과 집계를 한 번에 처리하므로 대량 데이터에서도 성능이 잘 나옴.
- 서브쿼리는 CTE보다 성능이 좋을 수 있음. 한 번만 계산되고 다시 재평가되지 않음.
- CTE는 대량 데이터를 처리할 때 성능 저하가 발생할 수 있음. 비물질화되기 때문에 참조될 때마다 재계산될 가능성 있음.
결론
- 데이터가 적을 때:
- 성능 차이가 크지 않기 때문에 CTE를 사용해서 가독성과 재사용성을 확보하는 게 좋음.
- 성능이 중요한 경우 HAVING 절이 가장 간결하고 빠름.
- 데이터가 많을 때:
- 성능이 가장 중요하다면 HAVING 절을 사용하는 게 적합함.
- 서브쿼리도 CTE보다 성능이 좋을 수 있지만, 가독성 측면에서는 떨어짐.
- CTE는 대량 데이터에서 성능 저하가 발생할 수 있어서, 복잡한 계산이 필요하지 않다면 피하는 게 좋음.
가독성 중시한다면 CTE, 성능상 이점은 HAVING... 인가?