[MSSQL] DISTINCT와 GROUP BY의 차이

Programming/Database 2011.10.21 댓글 Joshua95
특정 로그 테이블에서 저장된 IP 개수가 몇개 인지 확인하는 쿼리를 만드려고 합니다.
예를 들어 전체 1000개의 로그 중에, 10개의 IP가 사용 중이더라를 알고 싶은 거지요.

1) 전체 얻어오기 - 결과: 1000개
SELECT COUNT(f_SrcIP) as cnt FROM tbSomeTable;

2) GROUP BY 이용하기 : 결과: 10개
GROUP BY 를 해서 아래와 같이 만들었지요.
그런데 생각보다 길고 너저분하네요.

SELECT COUNT(*)
FROM
(
   SELECT f_SrcIP, COUNT(*) as cnt
   FROM tbSomeTable
   GROUP BY f_srcip
) a;

3) DISTINCT 를 이용하기 - 결과: 10개
동료 한 분이 아래 쿼리를 만들어서 사용하더군요.
오홋. 깔끔하네요. 

SELECT COUNT(DISTINCT f_SrcIP) as cnt FROM tbSomeTable;

**
그렇다면 여기서 당연한 의문이 드는것이
DISTINCT와 GROUP BY는 뭐가 틀린거야? 라는 질문이지요.

그래서 이래저래 찾아보니 결론은 이 정도가 되더군요.
1) DISTINCT와 GROUP BY 는 동일한 동작을 한다.
    실제 내부동작도 거의 동일하게 돌아가는다는 것입니다.

    참고: http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

2) DISTINCT는 집합함수 (Aggression) 필요시 사용 불가하다.
   코드가 짧은 대신 감수해야 되는 것이 있다는 것이지요.
   예를 들면, "SELECT f_SrcIP, COUNT(DISTINCT f_SrcIP) as cnt FROM tbTable;" 와 같은 쿼리는 불가능합니다. 이 경우에는 당연히 GROUP BY를 사용해야 합니다. 이러한 집합함수는 sum, max, min 등등 입니다.
    
3) 둘다 가능하다면 DISTINCT를 사용하라. 
  GROUP BY는 정렬 작업이 들어가므로, 성능이 DISTINCT 보다 느릴 수 있다.
  둘다 가능하다면 성능을 위해 DISTINCT를 사용하라. 반대로 정렬이 필요한 경우라면 DISTINCT 보다는 GROUP BY 를 사용하라. GROUP BY 절에서 기본 정렬을 수행한다는 것은 아직 확인 불가네요. 여튼 이런 의견이 있더라 정도로만 하고 SKIP.
   
   참고: http://intomysql.blogspot.com/2011/01/distinct-group-by.html

대충 이정도를 인식하고 사용하면 되겠습니다.
여튼 미리미리 자알 정리해둔 사람들이 있어서 세상 차암 편합니다. ^^

 - 2011.10.21 Joshua95
 


댓글