2010-02-20 3 views
4

이 웹 포럼은 일반적으로 일주일에 한 번씩 제거됩니다. 그래서 나는 그것을 스크랩하여 내 데이터베이스 (PostgreSQL)에 저장합니다.두 열에 COUNT 및 GROUP BY가있는 매우 느린 SQL 쿼리

사용자가 즐길 수있는 그래프와 가장 활발한 포럼 시간 등 데이터에 대한 분석도 수행합니다.

Column |   Type 
------------+------------------------------ 
id   | integer 
body  | text 
created_at | timestamp without time zone 
topic_id | integer 
user_name | text 
user_id | integer 

을 그리고 지금은 내 작은 10 포스터 테이블에 대해, 각 사용자의 게시물 개수를 갖고 싶어 :

그래서 난 그렇게처럼 게시물 테이블이있다.

나는이 함께했다 : 밝혀

SELECT user_id, user_name, count(*) 
FROM posts 
GROUP BY user_id, user_name 
ORDER BY count DESC LIMIT 10 

은 매우 느린. 9 초, 현재 게시물 테이블에 약 300 000 개의 행이 있습니다.

단 하나의 열에 그룹화하면 30 분 밖에 걸리지 않지만 둘 다 필요합니다.

저는 관계형 데이터베이스와 SQL에 익숙하지 않습니다. 그렇다면이게 옳은 것인지 확실하지 않거나 잘못하고있는 것일 수 있습니다.

답변

11

아마도 특정 ID를 가진 사용자가 한 명이므로 max(user_name)user_name과 같아야합니다. 그럼 당신은 당신의 게시물을 표시하는 하나의 컬럼에 그룹이 더 빨리 작동 할 수 있습니다

SELECT user_id, max(user_name), count(*) 
FROM posts 
GROUP BY user_id 
+0

+1 넵를 반환 가진 사용할 수 있습니다, 그게 할 수있는 방법입니다 :). 1999 년 이후의 sql 스펙에서는 'GROUP BY'목록에도 나타나지 않는 집계되지 않은 열을'SELECT' 목록에 나열 할 수 있습니다. 단, 해당 열이 기능적으로'GROUP BY '목록. 뻔뻔한 플러그 : http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html –

0

는 카운트가> 0 그래서 당신은 진정한