PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Consulta de registro mais recente eficiente com Postgresql


Se você não quiser alterar seu modelo de dados, use DISTINCT ON para buscar o registro mais recente da tabela "b" para cada entrada em "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC

Se você quiser evitar uma "classificação" na consulta, adicionar um índice como este pode ajudá-lo, mas não tenho certeza:
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, se você quiser classificar os registros da tabela "a" de alguma forma:
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

Abordagens alternativas


No entanto, todas as consultas acima ainda precisam ler todas as linhas referenciadas da tabela "b", portanto, se você tiver muitos dados, ainda poderá ser muito lento.

Você pode criar uma nova tabela, que contém apenas o registro "b" mais recente para cada a.id -- ou até mesmo mover essas colunas para a própria tabela "a".