Optimierung der GROUP BY-Abfrage zum abrufen der aktuellen Zeile pro Benutzer

Ich habe die folgenden log-Tabelle für Benutzer-Nachrichten (vereinfachte form) in Postgres 9.2:

CREATE TABLE log (
    log_date DATE,
    user_id  INTEGER,
    payload  INTEGER
);

Beinhaltet es einen Datensatz pro Benutzer und pro Tag. Es werden etwa 500K Datensätze pro Tag für 300 Tage. Nutzlast immer größer wird für jeden Benutzer (wenn das von Bedeutung ist).

Möchte ich effizient abrufen, den neuesten Datensatz für jeden Benutzer vor einem bestimmten Datum. Meine Abfrage ist:

SELECT user_id, max(log_date), max(payload) 
FROM log 
WHERE log_date <= :mydate 
GROUP BY user_id

was extrem langsam ist. Ich habe auch versucht:

SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;

die hat den gleichen plan-und ist genauso langsam.

Bisher habe ich einen einzigen index auf log(log_date), aber hilft nicht viel.

Und ich habe eine users Tabelle mit allen Benutzern enthalten. Ich möchte auch, um das Ergebnis abzurufen, die für einige Nutzer (die mit payload > :value).

Gibt es einen anderen index sollte ich verwenden, um diese Fahrt, oder auf irgendeine andere Art zu erreichen, was ich will?

InformationsquelleAutor xpapad | 2014-08-27
Schreibe einen Kommentar