PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Effiziente Abfrage des letzten Datensatzes mit Postgresql

Wenn Sie Ihr Datenmodell nicht ändern möchten, können Sie DISTINCT ON verwenden um den neuesten Datensatz aus Tabelle "b" für jeden Eintrag in "a" zu holen:

SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

Wenn Sie eine "Sortierung" in der Abfrage vermeiden möchten, könnte Sie einen Index wie diesen hinzufügen helfen, aber ich bin mir nicht sicher:

CREATE INDEX b_id_date ON b (id, date DESC)

SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC

Alternativ, wenn Sie Datensätze aus Tabelle "a" irgendwie sortieren möchten:

SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC

Alternative Ansätze

Alle oben genannten Abfragen müssen jedoch immer noch alle referenzierten Zeilen lesen aus Tabelle "b". Wenn Sie also viele Daten haben, ist es möglicherweise immer noch zu langsam.

Sie könnten eine neue Tabelle erstellen, die nur den neuesten "b"-Datensatz für jede a.id enthält -- oder diese Spalten sogar in die "a"-Tabelle selbst verschieben.