본문 바로가기
Programming/Database System

DISTINCT, GROUP BY 무엇을 쓸까

by kghworks 2022. 9. 26.

 데이터 중복제거, 집계 함수 사용 등을 할 때 많이들 사용하는 게 DISTINCT 함수GROUP BY 절입니다. 둘의 차이를 알아보고 경우에 따라 더 효율적으로 쓰기 위해 포스팅합니다.

 

목차

  • DISTICNT, GROUP BY 예시
  • 성능 차이 (실행 계획)
  • 가독성
  • 결론
  • 참조

DISTICNT, GROUP BY   예시

-- 요구 1 : 사원 테이블에서 부서 번호 별 소속 수 출력

SELECT DEPT_NO, COUNT(*)
FROM TB_USER
GROUP BY DEPT_NO;

-- 요구 2 : 사원 테이블에서 중복 제거한 부서 번호 출력

-- DISTINCT
SELECT DISTINCT DEPT_NO
FROM TB_USER;

-- GROUP BY
SELECT DEPT_NO
FROM TB_USER
GROUP BY DEPT_NO;

 목적에 따라 분리할 수 있겠네요. GROUP BY는 집계 함수를 쓰고자 할 때 사용하면 될 것 같습니다.

 

 그런데 제가 궁금한 건 GROUP BY로  중복제거도 할 수 있다는 점입니다. 요구 2를 보면 GROUP BY를 사용하건, DISTINCT를 사용하건 같은 결과를 돌려주는 걸 확인할 수 있습니다. 무엇이 더 효율적일까요?


성능 차이 (실행 계획)

 

 실행계획을 통해 성능 차이를 보겠습니다. 대략 3백만 row를 넘게 가진 테이블을 대상으로 실행했고, 인덱스가 없는 컬럼을 대상으로 하였습니다.

 

DISTINCT 함수 사용

 

GROUP BY 절 사용

 

 

 Cost가 동일합니다. 물론 둘 다 FULL TABLE SCAN 방식을 사용하기 때문에, 튜닝 포인트가 존재합니다만, 이번 포스팅에서는 DISTINCT와 GROUP BY의 비교에 대해서만 집중하려고 하니 넘어가겠습니다. 

 


가독성

 

 성능이 같다면, 가독성을 비교해봅시다. 

SELECT DISTINCT DEPT_NO
FROM TB_USER;

 위와 같이 DISTINCT 함수만 사용하였을 때 쿼리를 보면 바로 그 의도를 파악 가능합니다. DEPT_NO 컬럼의 데이터를 중복 제거하고 싶었구나.

 

SELECT DEPT_NO
FROM TB_USER
GROUP BY DEPT_NO;

 물론 위 쿼리도 그 결과가 같다는 걸 알고 있으나, 그 의도에 대해서는 DISTINCT보다는 불분명합니다. 저라면 자연스럽게 'GROUP BY 했으면 그다음은?' (집계 함수를 쓰던지, ORDER BY를 하던지 등...)이라는 의문점이 들 거 같습니다.

 

중복만을 제거하기 위해서 GROUP BY를 사용했다면 가독성이 DISTINCT에 비해 떨어질 수 있다고 생각합니다.

 

 다만, 아주 간단한 쿼리로 예시를 들었기 때문에 우린 모두 저 쿼리가 어떤 기능(중복 제거)을 하는지 압니다.  그러나 글자 수가 1천 개가 넘어가는 쿼리도 즐비한 상용 서비스에서는 얘기가 달라지죠. 그렇기 때문에 다소 거창한 단어 "가독성"을 들먹이며 비교해봤습니다.

 


결론

 

 중복제거를 위해서 GROUP BY와 DISTINCT 중 어느 것이 더 좋은 선택인지 비교해봤습니다.  아래와 같이 정리가 되었습니다.

 

DISTINCT

  • 데이터의 중복을 제거할 때

 

GROUP BY

  • 데이터를 그룹화한 다음 집계 함수를 사용하고자 할 때
  • 그룹화하는 과정에서 중복이 제거되는 기능도 할 수는 있음
  • 중복제거만을 위해서라면 DISTINCT를 사용하여 쿼리의 가독성을 높여보길

참조

 

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:32961403234212 

 

Ask The Oracle Mentors

Upcoming Office Hours Cards Free training, how-tos and Q&A with Oracle experts, every month! Learn more

asktom.oracle.com

https://community.oracle.com/tech/developers/discussion/908230/which-one-is-better-distinct-or-group-by

 

Which one is better Distinct or Group By?

Which one is better performance vise? Select A.aa,B.bb,C.cc From A,B,C Where A.aa = B.aa and A.cc = C.cc Group By A.aa,B.bb,C.cc OR

community.oracle.com

 

댓글