PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:l'utilizzo dell'istruzione AND in LEFT JOIN non funziona come previsto

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.