Оптимизировать запрос 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), но это мало помогает. Есть ли какой-то другой индекс, который я должен использовать, чтобы ускорить это, или любой другой способ достичь того, чего я хочу?