022. 서브쿼리가 더 나은 경우 - llighter/database GitHub Wiki

SQL 레벨업

1. 결합과 집약 순서

- 두 가지 방법

  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;
  1. 집약을 먼저 하고 결합하는 방법
-- 두 번째 방법: 집약을 먼저 수행
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 탈락이 발생하지 않는다면 괜찮은 트레이드오프이다.

실제 개발에서는 여러 요소가 개입되기 때문에 성능을 테스트 하고 판단을 내리는 것이 좋다.

다만, 튜닝 선택지 중 하나로 '사전에 결합 레코드 수를 압축한다' 라는 방법을 알아두자.