데이터 샘플링 VS GROUP BY 조회 성능 비교

2024. 2. 15. 10:29it

반응형

 

 

우리 회사의 경우, 데이터를 보여주는 방식은 크게 아래 2가지 방식이다.

 

  • 모든 데이터를 그냥 화면에 보여준다.
  • 모든 데이터를 특정기준으로 GROUP BY 해서 평균을 보여준다.

 

  1. 모든 데이터를 뿌리는 경우
    데이터의 양이 적으면 성능에 큰 문제가 발생하지 않지만, 데이터의 양이 늘어나게 되면 화면이 무거워져 사용자의 편의성이 떨어진다.

  2. 모든 데이터를 특정기준으로 GROUP BY 해서 평균
    [1. 모든 데이터를 뿌리는 경우]의 성능에 문제가 발생하면, 거의 모든 튜닝이 “GROUP BY 해서 뿌려주는 데이터를 줄이자” 방식으로 진입한다. 하지만, 이 경우, 바람직한 방식이 아니다. 이유는 데이터를 스캔하는 범위는 여전히 똑같고, 거기에 연산 작업이 추가되기 때문에 데이터를 조회하는 성능이 저하된다. “GROUP BY 해서 뿌려주는 데이터를 줄이자” 라는 방식은 분명 화면에서 뿌려주는 데이터 양이 적어, 화면의 성능을 개선시켜줄 수 있으나, 데이터베이스의 입장에서는 오히려 성능 저하가 발생한다.

 

* 데이터 샘플링 기법을 실제 기업에서는 사용하는가?

많은 기업에서는 데이터를 샘플링하는 기법을 사용한다. 통계적으로 로직을 만들어, 전체 데이터를 대표하는 데이터를 뽑아 내는 알고리즘을 개발하는 회사도 있고, 단순 인덱스를 들어, 해당 데이터를 뽑아 오는 방식이 있다.

동화의 경우, 샘플링 해서 데이터를 뽑아서 읽는 경우는 거의 없다. 2022년 모바일 프로젝트를 수행할 때 이후를 제외하고, 현재 샘플링 요청건수는 0건이다. 당시에도 AVG보다 샘플링이 성능이 좋다는 것을 몇번의 설득을 통해 겨우 적용할 수 있었다.

 

* 데이터 샘플링 기법이 왜 성능이 좋은가?

테이블의 데이터는 순서 없이 쌓이게 되므로 특정 조건의 데이터를 찾으려면 테이블의 모든 데이터에 접근하여 비교하는 과정이 필요하다.(full table scan) 하지만 인덱스가 있는 경우 search-key가 정렬되어 있기 때문에 조건 검색 시 속도가 빠르다. 이걸 활용해 데이터를 샘플링을 한다면, 조회 성능은 Full scan 에서 획기적으로 성능을 개선할 수 있을 것이다.

또한 데이터의 group by를 통해, 통계 정보를 연산하는 비용이 들지 않는다. 샘플링 결과를 특정 연산없이 바로 전달할 수 있어 성능 개선이 일어날 수 있다.

 

즉, group by해서 데이터를 avg나 중앙값으로 뭉개서 보여주는 것보다, 조회해야 할 양이 줄어들고, 통계치( min, max, avg) 하는 연산 비용이 들지 않아 성능이 개선될 수 있다.


* RDB 쿼리 예제
* 해당 쿼리는 샘플링을 위한 컬럼이 없어, group by를 수행 후, 데이터 양을 줄인 뒤 연산을 수행했다. 

  1. 단순 평균 연산
    조회 : 612ms

  2. 샘플링을 통한 연산
    조회 : 79ms

 

평균 VS 샘플링

 

 

* 결론
평균보다 샘플링 해서 데이터를 보여주는게, 성능이 더 좋다. 이는 화면에서 뿌려주는 데이터의 양이 줄어드는거 뿐만 아니라, 데이터베이스에서 조회하는 성능도 함께 향상이 되어, 사용자의 체감속도는 더 높을 것으로 예상된다. 따라서, 대용량의 데이터를 화면에 뿌리는 경우, 데이터를 샘플링해서 보여주는 것도 효율적인 방안이라고 생각이 든다.

반응형