LEFT JOIN
に関する混乱 およびWHERE
条項は何度も明確にされてきました:
この興味深い質問 残り:
Postgresには明示的なクエリヒントはありません。 (これは進行中の議論の問題です。)しかし、Postgresをあなたの道に曲げさせるためのさまざまなトリックがまだあります。
しかし、最初に、自問してみてください: クエリプランナーが、選択したプランを最初から安価であると見積もったのはなぜですか?サーバー構成は基本的に正常ですか?コスト設定は適切ですか? autovacuum
ランニング? Postgresバージョンは古くなっていますか?本当に修正する必要がある根本的な問題を回避していますか?
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によるクエリヒントに関する広範なブログです。 5歳ですが、まだ有効です。