sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:el uso de la declaración AND en LEFT JOIN no funciona como se esperaba

La confusión en torno a LEFT JOIN y WHERE cláusula se ha aclarado muchas veces:

Esta interesante pregunta queda:

No hay sugerencias de consulta explícitas en Postgres. (Lo cual es un tema de debate en curso). Pero todavía hay varios trucos para hacer que Postgres se doblegue en su camino.

Pero primero, pregúntese: ¿Por qué el planificador de consultas estimó que el plan elegido era más barato para empezar? ¿La configuración de su servidor es básicamente sana? ¿La configuración de costos es adecuada? autovacuum ¿correr? ¿La versión de Postgres está desactualizada? ¿Estás solucionando un problema subyacente que realmente debería solucionarse?

Si obliga a Postgres a hacerlo a su manera, debe asegurarse de que no se disparará después de una actualización de la versión o de la configuración del servidor... Será mejor que sepa lo que está haciendo exactamente.

Dicho esto, puede obligue a Postgres a "filtrar algunos registros antes de hacer JOIN " con una subconsulta donde agregas OFFSET 0 - que es solo ruido, lógicamente, pero evita que Postgres lo reorganice en la forma de una unión regular. (Consejo de consulta después de todo)

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;

O puede usar un CTE (menos oscuro, pero más caro). U otros trucos como establecer ciertos parámetros de configuración. O, en este caso particular, yo usaría un LATERAL unirse al mismo efecto:

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;

Relacionado:

Aquí hay un extenso blog sobre sugerencias de consultas de 2ndQuadrant. Tiene cinco años pero aún es válido.