특정 로그 테이블에서 저장된 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/
참고: 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 등등 입니다.
예를 들면, "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
대충 이정도를 인식하고 사용하면 되겠습니다.
여튼 미리미리 자알 정리해둔 사람들이 있어서 세상 차암 편합니다. ^^
- 2011.10.21 Joshua95
'Programming > Database' 카테고리의 다른 글
[PostgreSQL] 테이블 Lock 확인하기 (0) | 2013.01.23 |
---|---|
DB별 Top N 얻어오기 (0) | 2011.11.29 |
[MS-SQL] xp_cmdshell 이슈 정리 (0) | 2011.10.19 |
[DB2] DB 백업/복원 관련 커맨드 (0) | 2011.09.20 |
[MSSQL] DB 데이터를 text 파일로 보내기 (2) | 2011.07.19 |
댓글