- 4장 - 집약과 자르기2024년 09월 20일
- 31514
- 작성자
- 2024.09.20.:37
GROUP BY 구를 사용했을 때 SELECT 구에 입력할 수 있는 건 상수, 집약키, 집약 함수 뿐이다.
집약을 사용하면 내부적으로 정렬 또는 해시 알고리즘을 사용하는데, 최근에는 대부분 해시를 사용하는 경우가 많다.
예를 들어 GROUP BY 구에 지정되어 있는 필드를 해시 함수를 사용해서 해시키로 변환하고, 같은 해시키를 가진 그룹을 모아 집약하는 방식이다.
특히 해시의 성질상 GROUP BY의 유일성이 높으면 더 효율적으로 작동한다.
GROUP BY 성능
정렬과 해시 모두 메모리를 많은 사용하므로, 충분한 워킹 메모리가 확보되지 않으면 스왑이 발생한다.
스왑이 발생하면 저장소 위의 파일이 사용되면서 굉장히 느려진다.
따라서 연산 대상 레코드 수가 많은 GROUP BY 구를 사용할 때 충분한 성능 검증을 해줘야 한다.
GROUP BY 구의 자르기 기능
GROUP BY 구로 잘라 만든 하나하나의 부분 집합을 '파티션'이라고 부른다.
파티션은 서로 중복되는 요소를 가지지 않는 부분 집합이다.
자르기의 포인트는 기준이 되는 키를 GROUP BY 구와 SELECT 구 모두에 입력하는 것이다.
select substring(name, 1, 1) label, count(*) from persons group by substring(name, 1, 1);
select case when age < 20 then '어린이' when age between 20 and 60 then '성인' when age >= 70 then '노인' else null end age_class, count(*) from persons group by case when age < 20 then '어린이' when age between 20 and 60 then '성인' when age >= 70 then '노인' else null end;
참고로 GROUP BY 구에서 CASE 식 또는 함수를 사용해도 실행 계획에는 영향이 없다.
물론 단순한 필드가 아니라 필드에 연산을 추가한 식은 어느 정도 CPU 연산에 오버 헤드가 걸리지만, 이는 데이터를 뽑아온 뒤의 이야기이므로 데이터 접근 경로에는 영향을 주지 않는다.
GROUP BY구와 PARTITION BY 구의 차이점
윈도우 함수에서 사용된 PARTITION BY 구는 GROUP BY 구에서 집약 기능을 뺀 자르기 기능만 있다고 할 수 있다.
따라서 원래 테이블의 레코드의 수에 변화가 없고, 입력에 정보를 추가할 뿐이다.
'Book > SQL 레벨업' 카테고리의 다른 글
8장 - SQL의 순서 (0) 2024.09.27 7장 - 서브쿼리 (1) 2024.09.25 6장 - 결합 (0) 2024.09.24 5장 - 반복문 (0) 2024.09.23 3장 - SQL의 조건 분기 (0) 2024.09.19 다음글이전글이전 글이 없습니다.댓글