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.