JOIN句にUSING構文を使用すると、特定の場合に最適化の障壁が生じる可能性がありますか?


35

クエリ節のUSING(ではなくON)コンストラクトが、FROMSELECT一定の場合には、最適化の障壁を導入することがあります。

私はこのキーワードを意味します:

選択*
から
参加b 使用した(A_ID)

より複雑な場合にのみ。

コンテキスト:このコメントこの質問

私はこれをよく使いますがこれまでに気づいたことはありません。効果やリンクを示すテストケースに非常に興味があります詳細情報にます。私の検索努力は空っぽになりました。

完璧な答えは、表示するために、テストケースとなりUSING (a_id)、代替句に参加すると比較して劣った性能をON a.a_id = b.a_id- 場合はそれが実際に起こることができます。


2
@kgrittn:これは私がこれまで一般的に期待していたことです。結果マトリックスの列が1つ少なくなるため、それUSINGはわずかに高速です。調査結果は2005年と2008年にさかのぼります。問題はすべて修正されていると思います。ただし、考えられる制限があります。結果の結合列は結合生成物であるため、JOINを順番適用USINGする必要がある場合があります。これにより、JOINの並べ替えのオプションが制限される可能性があります。
アーウィンブランドステッター

1
結合でUSING条件を使用するVIEWは、ダンプ/復元で問題を引き起こす可能性があるため、このスレッドを使用するのをやめることに関係している可能性があります:archives.postgresql.org/pgsql- bugs / 2011-06 / msg00030.php 回避策がONを使用するUSINGのパフォーマンスの問題に関連する別のスレッドがまだあるというしつこい感じがありますが、それを見つけるのをあきらめるつもりです。ビューの外部で使用するのがおそらく安全であり、クエリが遅い場合は、診断ステップとして代わりにONを試すことを忘れないでください。
kgrittn

1
「使用」することでコードが少し読みやすくなりますが、両方のフィールドに同じ名前が必要だと思います。DBはいずれにせよマッチを行う必要があるため、使用は「オン」よりもパフォーマンスが良いとは思わない。これは、選択が結合と同じパフォーマンスを持っているようなものだ(間違っている場合は修正する)違いは、Joinがよりクリーンで保守しやすいことです。
jcho360

2
@HLGEM:これは単なるシンボリック名であり、私の例のようにテーブルが2つしかないため、混乱する余地はありません。それでも、私は質問を修正しました。id列名としての不幸な使用を奨励したくありません。
アーウィンブランドステッター

2
@ChristiaanWesterbeek:私は同意しません。詳細なPostgresの回答の「場所」(まだ)メーリングです。SOでアクティブになっているPostgres
開発

回答:


12

アーウィン:厳密な順序付けを使用するUSINGは、最適な計画が除外される多くのエッジケースを作成する可能性が高いという考えに同意します。私は最近、彼のクエリでこのようなものを持っている人を助けました:

LEFT JOIN ( 
     a 
     JOIN b ON a.id = b.a_id
     JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
     table1 t1
     JOIN table2 t2 ON t1.some_field = t2.other_field
     JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times

彼の場合、これらの結合ブロックの最悪の原因は、約20万回(計算を行う)で約20万行のネストされたループ結合を引き起こし、キーをインデックスにプッシュできなかったため、シーケンシャルスキャンでした。つまり、カスケードプランの変更により、クエリ全体の実行に約3時間かかりました。左結合を配布することにより、キーをプッシュダウンし、クエリを数秒で実行できました。もちろん、これは完全に同等ではないため、プランナーはそれらを同等として扱うことができないため、その計画をハッシュ結合として把握し、入れ子になったループを実行するのは非常に遅くなりました。

結合を特定の順序で厳密に強制的に実行する場合は常に、プランの実行時にキーフィルター情報がまだ利用できない可能性があるため、クイックインデックススキャン/ハッシュ結合で後でできることネストされたループ/シーケンシャルスキャンでは、はるかに低速で実行する必要がある場合があるため、上記のフラグメントはすぐには同等ではありませんが、同じ問題を示しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.