sql >> Database >  >> RDS >> PostgreSQL

Efficiënte laatste recordquery met Postgresql

Als u uw gegevensmodel niet wilt wijzigen, kunt u DISTINCT ON . gebruiken om het nieuwste record op te halen uit tabel "b" voor elk item in "a":

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

Als u een "sortering" in de zoekopdracht wilt vermijden, kan het toevoegen van een index zoals deze misschien help je, maar ik weet het niet zeker:

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

Als alternatief, als u op de een of andere manier records uit tabel "a" wilt sorteren:

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

Alternatieve benaderingen

Alle bovenstaande zoekopdrachten moeten echter nog steeds alle rijen waarnaar wordt verwezen lezen uit tabel "b", dus als je veel gegevens hebt, kan het nog steeds gewoon te traag zijn.

U kunt een nieuwe tabel maken, die alleen het nieuwste "b"-record bevat voor elke a.id -- of verplaats die kolommen zelfs naar de "a"-tabel zelf.



  1. t-sql select krijg alle maanden binnen een reeks van jaren

  2. Hoe kan ik het maandnummer (geen maandnaam) van een datum in SQL Server krijgen?

  3. Hoe versleutel ik dit wachtwoord met MD5 met PHP?

  4. Heeft het zin om een ​​index te gebruiken die een lage kardinaliteit heeft?