sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:Het gebruik van de EN-instructie in LEFT JOIN werkt niet zoals verwacht

De verwarring rond LEFT JOIN en WHERE clausule is vele malen verduidelijkt:

Deze interessante vraag blijft:

Er zijn geen expliciete zoekopdrachthints in Postgres. (Dat is een kwestie van voortdurend debat.) Maar er zijn nog steeds verschillende trucs om Postgres je kant op te laten buigen.

Maar vraag jezelf eerst af: Waarom schatte de queryplanner het gekozen plan om te beginnen goedkoper uit? Is uw serverconfiguratie in principe gezond? Kosten instellingen adequaat? autovacuum rennen? Postgres-versie verouderd? Werk je aan een onderliggend probleem dat echt opgelost zou moeten worden?

Als u Postgres dwingt om het op uw manier te doen, moet u er zeker van zijn dat het niet opnieuw wordt geactiveerd na een versie-upgrade of update van de serverconfiguratie ... U kunt maar beter weten wat u precies doet.

Dat gezegd hebbende, u kunt dwing Postgres om "enkele records uit te filteren voordat u de JOIN uitvoert " met een subquery waar u OFFSET 0 . toevoegt - wat logischerwijs gewoon ruis is, maar verhindert dat Postgres het herschikt in de vorm van een gewone join. (Tenslotte vraaghint)

SELECT la.listing_id, la.id, lar.*
FROM  (
   SELECT listing_id, id
   FROM   la
   WHERE  listing_id = 2780
   OFFSET 0
   ) la
LEFT   JOIN lar  ON lar.application_id = la.id;

Of u kunt een CTE gebruiken (minder obscuur, maar duurder). Of andere trucs zoals het instellen van bepaalde configuratieparameters. Of, in dit specifieke geval, Ik zou een LATERAL . gebruiken doe mee met hetzelfde effect:

SELECT la.listing_id, la.id, lar.*
FROM   la
LEFT  JOIN LATERAL (
   SELECT *
   FROM   lar
   WHERE  application_id = la.id
   )  lar ON true
WHERE  la.listing_id = 2780;

Gerelateerd:

Hier is een uitgebreide blog over Query-hints door 2ndQuadrant. Vijf jaar oud maar nog steeds geldig.



  1. MySQL-server is verdwenen op UPDATE (enorme QUERY, ongeveer 85 MB) met behulp van mysli PHP

  2. kolom verwijderen bestaat niet

  3. Resultaten krijgen van de postgresql-functie met tabelwaarde met JOOQ

  4. Een string opvragen uit de int-kolom?