sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL:LEFTJOINでANDステートメントを使用すると期待どおりに機能しません

    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歳ですが、まだ有効です。



    1. JavaからMySQLに画像を保存する

    2. SQLServerでクラスター化インデックスまたは非クラスター化インデックスを使用する場合

    3. Postgresのベンチマーク-XL

    4. FORMAT()は素晴らしいですが、…