3

典型的な左外部結合のシナリオを考えてみましょう。表の順序が非常に重要であることは誰もが知っています。たとえば、Q1Q2は同じではありません。

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)

複数の結合について概念的に考えるとき、通常、関心のあるオブジェクトとして新しいテーブルを取り上げ、その行が以前のものとどのように関連しているかを説明することを想像するのは自然なことのように思えます。用語を並列に保つことは私にとって何の利点もありません。私自身の習慣により、私は通常、結合条件を次のように記述します。

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)

構文がどのように機能するかを誤解している元同僚と会話しました。この同僚にとって、Q3は間違っていて、Q1は正しかった。そして、古いスタイルの外部結合構文ではこれが重要であり、それがおそらくこの混乱の原因であることを認識しています。私は、ANSI 結合を使用してこのケースを作成する人を他の誰かが聞いたり見たりしたことがありません。この質問に答えて、私の評判を取り戻してください。私が見落としていたことを指摘してください。または、誤った見方についてより深い洞察を提供してください。

式または述語の順序は、ANSI 結合を使用した標準 SQL の外部結合の結合条件に違いをもたらしますか?

4

4 に答える 4

5

いいえ、違いはありません。

個人的には、あなたが Q3 で示したスタイルの方が好きです。同僚の中には、Q1 のスタイルを好む人もいます。どちらかが間違っていると考える人を私は知りません。

クエリ オプティマイザは、クエリを裏返しにしてまったく異なるものに変換するため、述語は、処理が完了すると、単純な比較としては存在しなくなります。通常、それはインデックスまたはテーブルのルックアップであり、それは一方向でしか実行できないため、述語がどのように記述されたかは関係ありません。

(SQL Server 2005 で) 述語オペランドの順序が異なる 2 つのクエリの実行プランを確認しましたが、予想どおり、それらは同一です。

于 2012-07-07T03:21:16.653 に答える
3

Q3 の JOIN の条件順も好きです。

... ON B.id = A.id -- (Q3)

B.id がより変化するものであることを直接反映しているため、A.id をテスト対象の定数と考えることができます。

B.id = 1984

これをコードで見たくないのと同じように...

1984 = B.id

...、あなたのように、クエリでこれを見たくありません:

A.id = B.id

しかし、人生のほとんどのものと同様に、リトルエンディアンが好きな人もいれば、ビッグエンディアンが好きな人もいます。彼らが選択した好みに基づいてどのようなメンタル モデルが役立つとしても、彼らは少なくとも、彼らがなぜそれを望んだかという根拠をあなたに説明できるはずです。A.id = B.id

私は自分の好みを切り替える必要があると思いますが、私の(そしてあなたの)好みの条件の順序は、特にLinqのORMでは機能しません。条件が Q1 の順序である必要がある理由をまだ理解していません。

from x in A
join y in B on x.id equals y.id

また、条件を逆にすると (Q3 と同じですが、SQL クエリではエラーではありません)、順序が構文エラーになり、Linq では受け入れられません。

from x in A
join y in B on y.id equals x.id

ここで、Microsoft Linq の設計者が Q1 条件の順序を好んだ理由を見つけなければなりません。そして、それが理にかなっている場合はそれを評価するようにしてください。そして、それが(まだ)理にかなっていない場合でも、ただ受け入れてください.


それにかんする:

式または述語の順序は、標準 SQL の外部結合の結合条件に違いをもたらしますか?

結果的には、いいえ。パフォーマンスに関しては、結合の条件順序によってクエリが高速化されるクエリはまだ見たことがありません。フォーラムでさえ、クエリを高速化するために条件を逆にすることを支持している人を見たことがありません。

もし彼らがあなたに彼らの好みの状態のオーダーサーブの理論的根拠やメンタルモデルを説明できないなら、おそらく彼らはカーゴカルトプログラミングをしているだけか、もっと悪いことに、Bikeshedding

于 2012-07-07T03:48:47.227 に答える
2

等式比較の順序は、結合の結果に違いはありません。しかし、不可解な理由により、結果の計算効率に影響を与える可能性があります。SQLオプティマイザは、このような重要ではないように見える詳細の影響を受けることで有名です。

于 2012-07-07T03:04:58.663 に答える