sql >> Database teknologi >  >> RDS >> PostgreSQL

Effektiv seneste rekordforespørgsel med Postgresql

Hvis du ikke vil ændre din datamodel, kan du bruge DISTINCT ON for at hente den nyeste post fra tabel "b" for hver post i "a":

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

Hvis du vil undgå en "sortering" i forespørgslen, kan du tilføje et indeks som dette kan hjælpe dig, men jeg er ikke sikker:

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

Alternativt, hvis du vil sortere poster fra tabel "a" på en eller anden måde:

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 tilgange

Alle ovenstående forespørgsler skal dog stadig læse alle referencer fra tabel "b", så hvis du har mange data, kan det stadig være for langsomt.

Du kan oprette en ny tabel, som kun indeholder den nyeste "b"-record for hver a.id -- eller endda flytte disse kolonner ind i selve "a"-tabellen.



  1. Hvordan kan jeg yderligere optimere en afledt tabelforespørgsel, som yder bedre end den JOINed-ækvivalent?

  2. Skal jeg gemme landenavne i MySQL for hver bruger?

  3. hvordan gemmer jeg java datotype til mysql datotype?

  4. Tillader en bruger at vælge fra en tabel