022. 서브쿼리가 더 나은 경우 - llighter/database GitHub Wiki
1. 결합과 집약 순서
- 두 가지 방법
- 결합부터 하고 집약을 하는 방법
-- 첫 번째 방법: 결합을 먼저 수행
SELECT C.co_cd, MAX(C.district),
SUM(emp_nbr) AS sum_emp
FROM Companies C
INNER JOIN
Shops S
On C.co_cd = S.co_cd
WHERE main_flg = 'Y'
GROUP BY C.co_cd;
- 집약을 먼저 하고 결합하는 방법
-- 두 번째 방법: 집약을 먼저 수행
SELECT C.co_cd, C.district, sum_emp
FROM Companies C
INNER JOIN
(SELECT co_cd,
SUM(emp_nbr) AS sum_emp
FROM Shops
WHERE main_flg = 'Y'
GROUP BY co_cd) CSUM
ON C.co_cd = CSUM.co_cd;
- 결합 대상 레코드 수
첫 번째 방법
- 회사 테이블 : 레코드 4개
- 사업소 테이블 : 레코드 10개
두 번째 방법
- 회사 테이블 : 레코드 4개
- 사업소 테이블 : 레코드 4개
위와 같이 레코드 수가 적은 경우 성능상의 큰 차이는 없다. 하지만 데이터양이 늘어난다면?
- 회사 테이블 : 레코드 1,000개
- 사업소 테이블(main_flg='Y') : 레코드 500만 개
- 사업소 테이블(CSUM) : 레코드 1,000개
이렇게 회사 테이블의 규모에 비해 사업소 테이블의 규모가 매우 크다면, 일다 ㄴ결합 대상 레코드 수를 집약하는 편이 I/O 비용을 더 줄일 수 있다. 물론 두 번째 방법에서 집약 비용이 첫 번째 방법보다 클 것이지만 TEMP 탈락이 발생하지 않는다면 괜찮은 트레이드오프이다.
실제 개발에서는 여러 요소가 개입되기 때문에 성능을 테스트 하고 판단을 내리는 것이 좋다.
다만, 튜닝 선택지 중 하나로 '사전에 결합 레코드 수를 압축한다' 라는 방법을 알아두자.