예전부터 "group by 연산은 어떻게 하는 걸까" 하는 의문이 있었다.
일반 탐색의 경우와는 달리 aggregation 함수는 각 element 별로 모아주는 작업이 필요할테니까,
일반 탐색과는 다른 방법을 쓰지 않을까 하는 막연한 생각을 했었다.
먼저, 내가 생각했던 group by 연산은 당연하게도 SQL 이었다.
DBMS에서의 연산은 당연히 교과서를 직접 찾아보는 것이 가장 나은 것 같아서
Database System Concept 6th. Silberscharz 외 2명
이 책을 아는 개발자에게 빌려서 찾아보았다.
RDB 의 경우 B-tree(B+, B* 뭐든) 로 저장하는 것이 일반적이기 때문에 group by 연산은
일반적인 sort와 같은 방식으로 진행된다고 한다.
정렬된 데이터를 읽을 때 중복 제거 없이 aggregation 연산을 실행한다는 것이 결론.
뭔가 김빠지게 쉽네... 라고 생각하던 찰나에,
그냥 이대로 알았다하고 덮기는 허무하고 해서 궁금하던 거 더 찾아보았다.
나는 자바 개발자인데 C# 에 Linq 라고 SQL 문처럼 collection 을 다룰 수 있는 기능이 있다고 들었다.
C#을 잘 몰라서 Linq 내부 구현도 당연히 모르고 있었는데, 여기서는 group by를 어떻게 구현했을까 하는 생각이 들었다.
보통의 RDB 에서는 데이터를 내부에 tree 구조든 뭐든 미리 쌓아놓고 있는데,
어플리케이션 상에서 돌아가는 코드가 미리 데이터를 쌓아놓고 있을리는 없으니 group by 구현방식도 다르겠다- 싶었다.
그래서 통한의 영작으로 stackoverflow에 질문을 올렸더니
C# 개발자들에게 어그로라도 끌었는지... -1 먹고 -_-
어쨌든 답변을 받았다.
일단 Linq 는 길이가 짧은 collections를 처리하는 용도는 아니다.
물론 할 수는 있으나, 데이터 수가 많지 않은 경우에는 collections 자체에서 제공하는 메소드들 보다 성능이 떨어진다.
RDB나 외부 데이터 저장소와 붙어서 외부에서 데이터를 가져오는 용도로 사용하는 것이 더 일반적인 것 같다.
(C#을 많이 안 써봐서 확신은 없지만, query 가 가능한 경우에는 사용할 수 있는 듯. 실제로도 IQueryable 이라고 내부에 갖고 있고.)
Linq 에서는 group by를 할 때는 Dictionary 를 만들어서 데이터를 가지고 있다가 연산을 한다는 답변을 얻었다.
덤으로 내부 구현 코드 링크도 얻었다.
https://referencesource.microsoft.com/#system.core/system/linq/Enumerable.cs
Java 개발하다가 닷넷 문서보면 너무 부럽단 말이지 -ㅁ- ........
결론은 당연하지만,
group by 연산은 데이터 처리 방식에 따라서 다르게 구현할 수 있다는 거.
그리고 구현 방식에 대해서 알아보는 것이 좀 더 흥미로워졌다는 거 정도일 듯.
음...나만 몰랐나?ㅋㅋ
참고삼아서 내가 올렸던 질문글.
스파르타 현대인처럼 생긴 그리스 아저씨가 친절하게 답변해줘서 고마웠다
'Tech Note' 카테고리의 다른 글
글로벌 비디오 서비스가 가능하게 한 넷플릭스의 Microservice 아키텍쳐 구조 분석 (1) | 2021.01.24 |
---|---|
Consistent Hashing 일관된 해싱 (0) | 2020.12.27 |
HTTP/2 HTTP/3 의 차이점 (0) | 2019.09.10 |
Spring 4.x 에서 HttpServletRequest 의 params 를 변경하고 싶을 때 (0) | 2017.08.03 |
git 커밋 시간 변경하기 (0) | 2017.05.08 |