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

Efficiente query sui record più recenti con Postgresql

Se non desideri modificare il tuo modello di dati, puoi utilizzare DISTINCT ON per recuperare il record più recente dalla tabella "b" per ogni voce in "a":

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

Se vuoi evitare un "ordinamento" nella query, l'aggiunta di un indice come questo potrebbe ti aiuto, ma non ne sono sicuro:

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

In alternativa, se vuoi ordinare i record dalla tabella "a" in qualche modo:

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

Approcci alternativi

Tuttavia, tutte le query precedenti devono ancora leggere tutte le righe referenziate dalla tabella "b", quindi se hai molti dati, potrebbe essere ancora troppo lento.

Potresti creare una nuova tabella, che contenga solo il record "b" più recente per ogni a.id -- o anche spostare quelle colonne nella tabella "a" stessa.