La confusione intorno a LEFT JOIN
e WHERE
clausola è stata più volte chiarita:
Questa domanda interessante rimane:
Non ci sono suggerimenti di query espliciti in Postgres. (Che è una questione di dibattito in corso.) Ma ci sono ancora vari trucchi per far piegare Postgres.
Ma prima chiediti: Perché il pianificatore di query ha stimato che il piano scelto fosse più economico per cominciare? La configurazione del tuo server è sostanzialmente sana? Impostazioni dei costi adeguate? autovacuum
in esecuzione? Versione Postgres obsoleta? Stai risolvendo un problema di fondo che dovrebbe davvero essere risolto?
Se costringi Postgres a farlo a modo tuo, dovresti essere sicuro che non si riattivi dopo un aggiornamento della versione o un aggiornamento della configurazione del server ... Faresti meglio a sapere esattamente cosa stai facendo.
Detto questo, puoi forza Postgres a "filtrare alcuni record prima di eseguire il JOIN
" con una sottoquery in cui aggiungi OFFSET 0
- che è solo rumore, logicamente, ma impedisce a Postgres di riorganizzarlo nella forma di un join regolare. (Dopotutto un suggerimento per la query)
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;
Oppure puoi usare un CTE (meno oscuro, ma più costoso). O altri trucchi come l'impostazione di determinati parametri di configurazione. Oppure, in questo caso particolare, Utilizzerei un LATERAL
unisciti allo stesso effetto:
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;
Correlati:
Ecco un ampio blog sui suggerimenti per le query di 2ndQuadrant. Cinque anni ma ancora valido.