Объркването около LEFT JOIN
и WHERE
клауза е изяснена много пъти:
Този интересен въпрос остава:
В Postgres няма изрични съвети за заявки. (Което е въпрос на продължаващ дебат.) Но все още има различни трикове, за да накарате Postgres да се огъва по ваш път.
Но първо се запитайте: Защо планиращият заявки е преценил, че избраният план е по-евтин в началото? Конфигурацията на вашия сървър по принцип нормална ли е? Настройките на разходите са подходящи? autovacuum
бягане? Версията на Postgres е остаряла? Заобикаляте ли основен проблем, който наистина трябва да бъде отстранен?
Ако принудите Postgres да го направи по вашия начин, трябва да сте сигурни, че няма да задейства обратно, след надграждане на версията или актуализиране на конфигурацията на сървъра ... По-добре е да знаете какво точно правите.
Това каза, че можете принуди Postgres да "филтрира някои записи, преди да направи JOIN
" с подзаявка, където добавяте OFFSET 0
- което е просто шум, логично, но не позволява на Postgres да го пренареди във формата на редовно съединение. (Все пак съвет за заявка)
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;
Или можете да използвате CTE (по-малко неясен, но по-скъп). Или други трикове като задаване на определени конфигурационни параметри. Или в този конкретен случай бих използвал LATERAL
присъединете се към същия ефект:
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;
Свързани:
Ето един обширен блог за подсказки за заявки от 2ndQuadrant. Пет годишен, но все още валиден.