Ch.4 집약과 자르기 - 집합의 세계

텐저린티·2023년 8월 7일
0

SQL레벨업

목록 보기
4/10
post-thumbnail
  • 집합 지향
    • 레코드 단위가 아닌, 레코드 집합 단위로 처리 기술
    • GROUP BY
    • HAVING
    • 집약함수
    • 윈도우함수

12강. 집약

  • 집약 함수 (aggregate function)
    • COUNT
    • SUM
    • AVG
    • MAX
    • MIN

여러 레코드를 한 개 레코드로 집약

  • 필드 수가 다르고 한 사람에 대한 정보가 여러 레코드로 나눠져 있는 테이블
  • 집약을 사용하면 한 사람에 대한 정보가 한 레코드로 집약
  • 모델링 관점에서도 엔티티(테이블)은 집약되어야 함.

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 별 집약 알고리즘
  • 해시 알고리즘
    • Oracle
    • PostgreSQL
  • 정렬 알고리즘
    • MySQL
profile
개발하고 말테야

0개의 댓글

관련 채용 정보