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

JOINとLEFTJOINおよびWHERE条件のパフォーマンスの提案をより詳細に説明する

    事実上、WHERE 条件とJOIN [INNER] JOINの条件 PostgreSQLでは100%同等です。 (明示的なJOINを使用することをお勧めします ただし、クエリを読みやすく、維持しやすくするための条件)。

    同じことはない LEFT JOINの場合はtrue WHEREと組み合わせる 結合の右側のテーブルの条件。 LEFT JOINの目的 右側の一致に関係なく、結合の左側のすべての行を保持することです。一致するものが見つからない場合、行はNULLで拡張されます 右側の列の値。マニュアル:

    LEFT OUTER JOIN

    最初に、内部結合が実行されます。次に、T2のどの行とも結合条件を満たさないT1の各行について、結合された行がT2の列にnull値で追加されます。したがって、結合されたテーブルには、T1の各行に少なくとも1つの行が常にあります。

    次に、WHEREを適用すると NULL以外のものを必要とする条件 右側のテーブルの列の値を指定すると、効果が無効になり、LEFT [OUTER] JOINが強制的に変換されます。 プレーンな[INNER] JOINのように機能する 、クエリプランがより複雑なため、(おそらく)より高価になります。

    結合されたテーブルが多数あるクエリでは、Postgres(または任意のRDBMS)を使用して、最適な(または適切な)クエリプランを見つけるのは困難です。テーブルを結合するための理論的に可能なシーケンスの数は、階乗増加します。 (!)。 Postgresはタスクに「GenericQueryOptimizer」を使用しており、それに影響を与えるいくつかの設定があります。

    誤解を招くLEFT JOINでクエリをわかりにくくする 概説したように、クエリプランナーの作業が難しくなり、人間の読者にとって誤解を招き、通常はクエリロジックのエラーを示唆します。

    これに起因する問題の関連回答:

    • WHEREでnullが整数に等しいのはなぜですか?
    • LEFTJOINを使用したクエリがカウント0の行を返さない
    • 外部結合を使用し、各親の子レコードを制限するSQLクエリ
    • 内側の結合のように機能する左の外側の結合
    • 他のテーブルに存在しない行を選択します

    など



    1. 2つの行間の時間差を計算する

    2. SQLServerで月曜日を週の最初の曜日として設定する方法

    3. PostgreSQL数学関数

    4. 2つの日付の間の月曜日を検索