Очень медленный SQL-запрос с COUNT и GROUP BY на двух столбцах - PullRequest
4 голосов
/ 20 февраля 2010

Я архивирую этот веб-форум, который обычно очищается примерно раз в неделю. Поэтому я проверяю это на экране и сохраняю в своей базе данных (PostgreSQL).

Я также делаю небольшой анализ данных, с некоторыми графиками для пользователей, например, какое время суток форум наиболее активен, и т. Д.

Итак, у меня есть таблица сообщений, например:

   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 строк.

Это займет всего полсекунды, если я сгруппируюсь только по одному столбцу, но мне нужны оба.

Я довольно плохо знаком с реляционными базами данных и SQL, так что я не совсем уверен, правильно ли это или просто как я делаю это неправильно?

Ответы [ 2 ]

11 голосов
/ 20 февраля 2010

Вероятно, есть только один пользователь с определенным идентификатором, поэтому max(user_name) должно равняться user_name. Затем вы можете сгруппировать по одному столбцу, который, как указывает ваш пост, работает быстрее:

SELECT user_id, max(user_name), count(*)
FROM posts
GROUP BY user_id
0 голосов
/ 20 февраля 2010

также может использовать счет> 0, поэтому вы возвращаете только true

...