2010-02-20 20 views
4

我正在歸檔此Web論壇,該論壇通常每週清除一次。所以我在屏幕上抓取它,並將其存儲到我的數據庫(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秒,目前在帖子表中僅有約30萬行。

如果我只在一列上組合,它只需要半秒鐘,但我需要兩者。

我對關係數據庫和SQL非常陌生,所以我不太確定這是對的,還是我怎麼做錯了?

回答

11

可能只有一個用戶使用特定ID,因此max(user_name)應該等於user_name。然後你就可以對單個列,其中您的文章指出小組工作更快:

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

+1是啊,這是做它的方式: )。在sql spec 1999和更高版本中,它實際上允許列出'SELECT'列表中未列入「GROUP BY」列表中的未聚合列,只要這些列在功能上依賴於GROUP BY列表。無恥的插件:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html – 2010-02-20 17:26:13

0

也可以使用具有計數> 0,因此只返回true