sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta de registro más reciente eficiente con Postgresql

Si no desea cambiar su modelo de datos, puede usar DISTINCT ON para obtener el registro más reciente de la tabla "b" para cada entrada en "a":

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

Si desea evitar una "clasificación" en la consulta, agregar un índice como este podría ayudarte, pero no estoy seguro:

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

Alternativamente, si desea ordenar los registros de la tabla "a" de alguna manera:

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

Enfoques alternativos

Sin embargo, todas las consultas anteriores aún deben leer todas las filas a las que se hace referencia de la tabla "b", por lo que si tiene muchos datos, es posible que siga siendo demasiado lento.

Podría crear una nueva tabla, que solo contenga el registro "b" más nuevo para cada a.id -- o incluso mover esas columnas a la tabla "a".