Förvirringen kring LEFT JOIN
och WHERE
klausul har förtydligats många gånger:
Denna intressanta fråga kvar:
Det finns inga explicita frågetips i Postgres. (Vilket är en fråga om pågående debatt.) Men det finns fortfarande olika knep för att få Postgres att böja dig.
Men först, fråga dig själv: Varför uppskattade frågeplaneraren att den valda planen var billigare till att börja med? Är din serverkonfiguration i princip sund? Är kostnadsinställningarna tillräckliga? autovacuum
löpning? Postgres version föråldrad? Arbetar du kring ett underliggande problem som verkligen borde åtgärdas?
Om du tvingar Postgres att göra det på ditt sätt, bör du vara säker på att det inte kommer att avfyras, efter en versionsuppgradering eller uppdatering av serverkonfigurationen ... Det är bäst att du vet vad du gör exakt.
Som sagt, du kan tvinga Postgres att "filtrera bort några poster innan du gör JOIN
" med en underfråga där du lägger till OFFSET 0
- vilket bara är brus, logiskt, men hindrar Postgres från att arrangera om det till formen av en vanlig join. (Frågetips trots allt)
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;
Eller så kan du använda en CTE (mindre obskyr, men dyrare). Eller andra knep som att ställa in vissa konfigurationsparametrar. Eller, i det här specifika fallet, skulle jag använda en LATERAL
gå med i samma effekt:
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;
Relaterat:
Här är en omfattande blogg om frågetips från 2ndQuadrant. Fem år gammal men fortfarande giltig.