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.