У меня есть следующая таблица журнала для пользовательских сообщений (упрощенная форма) в Postgres 9.2:
CREATE TABLE log (
    log_date DATE,
    user_id  INTEGER,
    payload  INTEGER
);
Он содержит до одной записи на пользователя и в день. Будет около 500 тысяч записей в день в течение 300 дней. Полезная нагрузка постоянно увеличивается для каждого пользователя (если это имеет значение).
Я хочу эффективно получить последнюю запись для каждого пользователя до определенной даты. Мой запрос:
SELECT user_id, max(log_date), max(payload) 
FROM log 
WHERE log_date <= :mydate 
GROUP BY user_id
что очень медленно. Я также попробовал:
SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;
который имеет тот же план и одинаково медленно.
 Пока у меня есть один индекс в log(log_date), но это мало помогает.
 И у меня есть таблица users со всеми включенными пользователями. Я также хочу получить результат для некоторых пользователей (пользователей с payload > :value).
Есть ли какой-то другой индекс, который я должен использовать, чтобы ускорить это, или любой другой способ достичь того, чего я хочу?
