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