アーウィン:厳密な順序付けを使用する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時間かかりました。左結合を配布することにより、キーをプッシュダウンし、クエリを数秒で実行できました。もちろん、これは完全に同等ではないため、プランナーはそれらを同等として扱うことができないため、その計画をハッシュ結合として把握し、入れ子になったループを実行するのは非常に遅くなりました。
結合を特定の順序で厳密に強制的に実行する場合は常に、プランの実行時にキーフィルター情報がまだ利用できない可能性があるため、クイックインデックススキャン/ハッシュ結合で後でできることネストされたループ/シーケンシャルスキャンでは、はるかに低速で実行する必要がある場合があるため、上記のフラグメントはすぐには同等ではありませんが、同じ問題を示しています。
USING
はわずかに高速です。調査結果は2005年と2008年にさかのぼります。問題はすべて修正されていると思います。ただし、考えられる制限があります。結果の結合列は結合生成物であるため、JOINを順番に適用USING
する必要がある場合があります。これにより、JOINの並べ替えのオプションが制限される可能性があります。