A confusão em torno de
LEFT JOIN
e WHERE
cláusula foi esclarecida muitas vezes:Esta pergunta interessante restos:
Não há dicas de consulta explícitas no Postgres. (O que é uma questão de debate contínuo.) Mas ainda existem vários truques para fazer o Postgres dobrar seu caminho.
Mas primeiro, pergunte a si mesmo: Por que o planejador de consultas estimou que o plano escolhido seria mais barato para começar? A configuração do seu servidor é basicamente sã? Configurações de custo adequadas?
autovacuum
corrida? Versão do Postgres desatualizada? Você está trabalhando em torno de um problema subjacente que realmente deve ser corrigido? Se você forçar o Postgres a fazer do seu jeito, você deve ter certeza de que ele não irá disparar de volta, após uma atualização de versão ou atualização da configuração do servidor... É melhor você saber exatamente o que está fazendo.
Dito isso, você pode forçar o Postgres a "filtrar alguns registros antes de fazer o
JOIN
" com uma subconsulta onde você adiciona OFFSET 0
- que é apenas ruído, logicamente, mas impede o Postgres de reorganizá-lo na forma de uma junção regular. (Dica de consulta afinal) 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;
Ou você pode usar um CTE (menos obscuro, mas mais caro). Ou outros truques como definir certos parâmetros de configuração. Ou, neste caso específico, eu usaria um
LATERAL
juntar para o mesmo efeito: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:
Aqui está um extenso blog sobre dicas de consulta do 2ndQuadrant. Cinco anos de idade, mas ainda válido.