Die Verwirrung um LEFT JOIN
und WHERE
Klausel wurde viele Male geklärt:
Diese interessante Frage bleibt:
Wie die Datenbank machen einige herausfiltern Aufzeichnungen vor dem JOIN?
In Postgres gibt es keine expliziten Abfragehinweise. (Was derzeit diskutiert wird.) Aber es gibt immer noch verschiedene Tricks, um Postgres den Weg zu bahnen.
Aber zuerst, fragen Sie sich: Warum schätzte der Abfrageplaner den gewählten Plan, um am Anfang billiger zu sein?Ist Ihre Serverkonfiguration grundsätzlich vernünftig? Kosteneinstellungen angemessen? autovacuum
läuft? Postgres-Version veraltet? Arbeiten Sie an einem zugrunde liegenden Problem, das eigentlich behoben werden sollte?
Wenn Sie Postgres zwingen, es auf Ihre Art zu tun, sollten Sie sicher sein, dass es nicht zurückfeuert, nach einem Versionsupgrade oder einem Update auf die Serverkonfiguration ... Sie sollten besser wissen, was Sie gerade tun.
Das heißt, Sie können Kraft Postgres „einige Datensätze herauszufiltern, bevor der JOIN
tun“ mit einer Unterabfrage, wo OFFSET 0
Sie hinzufügen - das ist nur Lärm, logisch, aber verhindert, dass Postgres es in die Form neu anordnen eines regulären Joins. (Abfrage Hinweis immerhin)
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;
Oder Sie können ein CTE (weniger obskur, aber teurer) verwenden. Oder andere Tricks wie das Setzen bestimmter Config-Parameter. Oder in diesem speziellen Fall würde ich ein LATERAL
auf den gleichen Effekt kommen:
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;
Verwandte:
Here is an extensive blog on Query hints by 2ndQuadrant. Fünf Jahre alt, aber immer noch gültig.
Sie fragen zwei verschiedene Dinge. Die Abfragen sind unterschiedlich und werden nicht dasselbe tun. In Bezug auf die Geschwindigkeit brauchen Sie wahrscheinlich Index. Versuchen Sie 'EXPLAIN ANALYSE' –
Warum sind sie anders? –
Können Sie uns beide Ergebnisse zeigen? –