- 집합 지향
- 레코드 단위가 아닌,
레코드 집합 단위
로 처리 기술
- GROUP BY
- HAVING
- 집약함수
- 윈도우함수
12강. 집약
- 집약 함수 (aggregate function)
여러 레코드를 한 개 레코드로 집약
- 필드 수가 다르고 한 사람에 대한 정보가 여러 레코드로 나눠져 있는 테이블
- 집약을 사용하면 한 사람에 대한 정보가 한 레코드로 집약
- 모델링 관점에서도 엔티티(테이블)은 집약되어야 함.
CASE 식과 GROUP BY 응용
- GROUP BY 로 집약 시 SELECT 구에 입력 가능한 것
- 상수
- GROUP BY 구에서 사용한 집약 키
- 집약 함수
select id,
max(case when data_type = 'a' then d1 else null end) as d1,
max(case when data_type = 'b' then d2 else null end) as d2
from ...
group by id;
집약, 해시, 정렬
- GROUP BY 집약 조작에
해시 알고리즘
, 정렬 알고리즘
사용
해시 > 정렬
- 해시
- GROUP BY 구에 지정된 필드를 해시 함수 이용해 해시키 변환
- 같은 해시 키 가진 그룹 모아 집약
- 정렬보다 빠름
- 특성상 GROUP BY 유일성 높을수록 효율적
- 워킹 메모리
- 해시, 정렬에 메모리 사용
- 워킹 메모리 영역이 부족한 경우
TEMP 탈락
발생
- 저장소 접근 → 성능 감소
- TEMP 탈락
- 연산 대상 레코드 수가 많은 GROUP BY, 집약함수 사용하는 건 충분한 성능 검증 필요
- 최악의 경우 TEMP 영역 풀 소비로 SQL 구문 비정상 종료 가능
합쳐서 하나
- 0~100살 연령이 모두 사용 가능한 제품 레코드 조회
select product_id
from price_by_age
group by product_id
having sum(high_age - low_age + 1) = 101;
13장. 자르기
파티션
- GROUP BY 구로 잘라 만든 부분집합
- 서로 중복되는 요소 없음
select case when age < 20 then '잼민'
when age between 20 and 69 then '성인'
when age >= 70 then '노인'
else null end as age_class, count(*)
from persons
group by case when age < 20 then '잼민'
when age between 20 and 69 then '성인'
when age >= 70 then '노인'
else null end;
- 자르기 기준 키를 GROUP BY, SELECT 모두에 써줘야 함
- SELECT 구에서 지정한 별칭을 GROUP BY 에서 사용하는 변칙 존재
- GROUP BY 구에서
CASE 식
, 함수
사용해도 성능에는 영향 X
복잡한 수식
사용해도 좋다
PARTITION BY 구 자르기
- 윈도우 함수
- GROUP BY (집약 + 자르기) - 집약 = 자르기
- 여기서도
CASE 식, 함수, 복잡 수식
모두 사용 가능
- 집약 기능 없으므로, 원본 테이블의 형태 유지됨에 유의
정리
- GROUP BY, PARTITION BY는 집합 자르기
- 자르기에는 내부적으로 해시, 정렬 사용
- 해시, 정렬은 워킹 메모리 필요 → 성능 영향
- CASE 식과 함께라면 뭐든 가능
연습문제
- 각 RDB 별 집약 알고리즘
- 해시 알고리즘
- 정렬 알고리즘