본문 바로가기
Data Analysis/SQL

[SQL] 07. 조건 분기 응용2 (집계 함수를 활용한 조건 분기 비교)

by Dlearner 2019. 7. 18.
반응형

조건분기 활용 비교하기(feat. 집계 함수)

지난 포스팅에서는 CASE 식과 UNION + WHERE 구를 비교하며 성능에 대한 차이를 비교했다. 이번 포스팅에서는 집계 함수를 활용할 때의 CASE 식과 UNION + WHERE 구의 성능을 비교하는 예시를 소개하려 한다.

 

 

아래의 Population 테이블을 통해, (1)집계 대상으로 조건 분기 하는 경우(2)집약 결과로 조건 분기를 하는 경우를 설명해보겠다.

 

- Population 테이블- 

 

 

 

 

(1) 집계 대상으로 조건 분기하는 경우

 

- UNION + WHERE 구 활용

아래의 쿼리는 원래의 Population 테이블의 레코드를 레이아웃을 바꿔 보여주는 기능을 하는 쿼리이다.

 

지역(prefecture)별로 그룹화하여 성별(sex)가 남자(1)인 경우의 인구수를 뽑아내고, 같은 방법으로 성별(sex)가 여자(2)인 경우의 인구수를 뽑아내어 UNION 하는 방식이다.

 

이 또한 예상했던 바와 같이 서브쿼리 안에서 거의 같은 모양의 쿼리를 두 번 반복한 비효율 적인 쿼리가 만들어졌다. 또한 WHERE 구에서 sex 필드로 분기를 하여 결과를 UNION 함으로써 절차 지향적인 구성에서 벗어나지 못한 쿼리라 평가된다.

 

- UNION + WHERE 구를 활용한 조건분기 -

 

 

 

CASE 식 활용

위와 같은 결과를 CASE 식을 활용하여 만들어보았다.

 

CASE 식을 집계 함수(이 예시에서는 SUM( ) 함수) 내부에 포함시켜서 성별에 대한 필터를 만들었기 때문에, 쿼리가 위와 비교했을 때 매우 간단해 졌음을 알 수있다.

또한 테이블 스캔이 1번만 이루어져 성능의 개선이 있음을 볼 수있다.

 

- CASE 식을 활용한 조건분기 -

 

 

 

 

(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을 활용해 매칭한 것은 변함 없기 때문에 성능적으로 비효율적인 쿼리라 할 수 있겠다.

 

- UNION + WHERE 구를 활용한 조건분기(집약함수) -

 

 

 

CASE 식 활용

CASE 식을 활용하여 위와 똑같은 결과를 생성해냈다. 이번에는 CASE 식 내부에 집계함수를 포함시켜서 인구별 구간에 따른 필터링을 진행하였다.

 

다른 예시와 마찬가지로 결과를 추출하는 쿼리가 위와 비교했을 때 매우 간단해 졌으며, UNION 구를 활용했을 때 보다 테이블 스캔이 2번 절약되는 것을 알 수있다.

 

- CASE 식을 활용한 조건분기(집약함수) -

 

 

 


 

지금까지의 예시들에서는 CASE 식이 UNION 구보다 성능적으로 뛰어남을 보였다.

 

하지만 SELECT 구문에서 사용하는 테이블이 각기 다른 경우에는 UNION 구를 사용해야 하며, 때로는 UNION 구의 성능이 더 나을 때도 존재할 수 있으니(이 부분은 자세히 다루지 않으려 한다.) 어떤 결과를 뽑아낼지에 따라 쿼리 형태를 결정하면 된다.

반응형

댓글