Оптимизировать запрос GROUP BY для получения последней записи для пользователя

У меня есть следующая таблица (упрощенная форма) в Postgres 9.2

CREATE TABLE user_msg_log (
    aggr_date DATE,
    user_id INTEGER,
    running_total INTEGER
);

Он содержит до одной записи на пользователя и в день. Будет около 500 тысяч записей в день в течение 300 дней. running_total всегда увеличивается для каждого пользователя.

Я хочу эффективно получить последнюю запись для каждого пользователя до определенной даты. Мой запрос:

SELECT user_id, max(aggr_date), max(running_total) 
FROM user_msg_log 
WHERE aggr_date <= :mydate 
GROUP BY user_id

что очень медленно. Я также попробовал:

SELECT DISTINCT ON(user_id), aggr_date, running_total
FROM user_msg_log
WHERE aggr_date <= :mydate
ORDER BY user_id, aggr_date DESC;

который имеет тот же план и одинаково медленно.

Пока у меня есть один индекс для user_msg_log (aggr_date), но это мало помогает. Есть ли какой-то другой индекс, который я должен использовать, чтобы ускорить это, или любой другой способ достичь того, чего я хочу?

Ответы на вопрос(3)

Ваш ответ на вопрос