조건분기 활용 비교하기(feat. 집계 함수)
지난 포스팅에서는 CASE 식과 UNION + WHERE 구를 비교하며 성능에 대한 차이를 비교했다. 이번 포스팅에서는 집계 함수를 활용할 때의 CASE 식과 UNION + WHERE 구의 성능을 비교하는 예시를 소개하려 한다.
아래의 Population 테이블을 통해, (1)집계 대상으로 조건 분기 하는 경우와 (2)집약 결과로 조건 분기를 하는 경우를 설명해보겠다.
(1) 집계 대상으로 조건 분기하는 경우
- UNION + WHERE 구 활용
아래의 쿼리는 원래의 Population 테이블의 레코드를 레이아웃을 바꿔 보여주는 기능을 하는 쿼리이다.
지역(prefecture)별로 그룹화하여 성별(sex)가 남자(1)인 경우의 인구수를 뽑아내고, 같은 방법으로 성별(sex)가 여자(2)인 경우의 인구수를 뽑아내어 UNION 하는 방식이다.
이 또한 예상했던 바와 같이 서브쿼리 안에서 거의 같은 모양의 쿼리를 두 번 반복한 비효율 적인 쿼리가 만들어졌다. 또한 WHERE 구에서 sex 필드로 분기를 하여 결과를 UNION 함으로써 절차 지향적인 구성에서 벗어나지 못한 쿼리라 평가된다.
- CASE 식 활용
위와 같은 결과를 CASE 식을 활용하여 만들어보았다.
CASE 식을 집계 함수(이 예시에서는 SUM( ) 함수) 내부에 포함시켜서 성별에 대한 필터를 만들었기 때문에, 쿼리가 위와 비교했을 때 매우 간단해 졌음을 알 수있다.
또한 테이블 스캔이 1번만 이루어져 성능의 개선이 있음을 볼 수있다.
(2) 집약 결과로 조건 분기를 하는 경우
이번 예시는 집약된 결과에 조건을 부여하는 예시로, 지역별 인구 수를 구하여 아래 조건에 맞는 결과를 추출해주어야 한다.
1. 인구수가 200이상인 경우 'pop_all'에 '인구 200 이상'을 출력
2. 인구수가 150이상 200미만인 경우 'pop_all'에 '인구 150이상 200미만'을 출력
3. 인구수가 150미만인 경우 'pop_all'에 '인구 150 미만'을 출력
- UNION + GROUP BY&HAVING 구 활용
아래 쿼리는 UNION + GROUP BY&HAVING 구 활용하여 출력해 낸 결과이다.
위의 예시에서는 조건 분기가 단순 레코드 값에 적용된 반면, 이번 예시에서는 "집합의 레코드 수(SUM(pop))"에 적용이 되었기 때문에 WHERE 구가 아닌 HAVING 구에 지정이 되었음을 알 수있다. 하지만 형식이 다를 뿐이지 UNION을 활용해 매칭한 것은 변함 없기 때문에 성능적으로 비효율적인 쿼리라 할 수 있겠다.
- CASE 식 활용
CASE 식을 활용하여 위와 똑같은 결과를 생성해냈다. 이번에는 CASE 식 내부에 집계함수를 포함시켜서 인구별 구간에 따른 필터링을 진행하였다.
다른 예시와 마찬가지로 결과를 추출하는 쿼리가 위와 비교했을 때 매우 간단해 졌으며, UNION 구를 활용했을 때 보다 테이블 스캔이 2번 절약되는 것을 알 수있다.
지금까지의 예시들에서는 CASE 식이 UNION 구보다 성능적으로 뛰어남을 보였다.
하지만 SELECT 구문에서 사용하는 테이블이 각기 다른 경우에는 UNION 구를 사용해야 하며, 때로는 UNION 구의 성능이 더 나을 때도 존재할 수 있으니(이 부분은 자세히 다루지 않으려 한다.) 어떤 결과를 뽑아낼지에 따라 쿼리 형태를 결정하면 된다.
'Data Analysis > SQL' 카테고리의 다른 글
[SQL] 09. SQL에서의 반복 (CASE&WINDOW함수 + 예시2) (0) | 2019.07.18 |
---|---|
[SQL] 08. SQL에서의 반복 (개념 + CASE&WINDOW함수 + 예시1) (0) | 2019.07.18 |
[SQL] 06. 조건 분기 응용1 (CASE 식과 WHERE 구의 비교) (0) | 2019.07.17 |
[SQL] 05. 조건 분기(CASE),집합 연산, 윈도우 함수(WINDOW) (0) | 2019.07.17 |
[SQL] 04. SQL 기초 쿼리2 (GROUP BY&HAVING/ORDER BY/서브쿼리) (0) | 2019.07.15 |
댓글