2011-08-25 24 views
0

可能性の重複:
SQL JOIN: is there a difference between USING, ON or WHERE?SQLクエリの最適化

私が使用している場合、私はAとBという2つのテーブルを持っている場合、A 2万行を持っており、Bはわずか100行を持って考えてみましょうこれらSELECTのステートメントは、私はこれらの2

SELECT A.C1, B.C1 
FROM A, B 
WHERE A.C1 = B.C2 

の違いを知っておく必要がありますもう一つは、私はパフォーマンスのレベルを見ていると私は、この間のコアの違いを知っておく必要があり

SELECT A.C1, B.C1 
FROM A 
INNER JOIN B ON A.C1 = B.C2 

です。私の同僚と話をしたとき、彼は最初のクエリはクロス・ジョイントでパフォーマンスが低下すると言いましたが、私はそのように考えていません。

助けてください。

あなたがここで提案する理由は何ですか?

答えて

9

パフォーマンスには違いはありません。最初の1つはではなくクロス結合です。有効なWHERE句があるように見えるからです。

唯一の違いは、ANSI-92標準に準拠している点です。私は個人的にANSI準拠の2番目のクエリを使用することを好みますが、実際はあなた次第です。

も読み:ANSI vs. non-ANSI SQL JOIN syntax

+0

+1はい、**常に** 2番目のバージョンを使用してください - JOIN条件付きの「INNER JOIN」ははるかに明確です。また、最初の(レガシー)JOIN構文では、結合条件を指定するのを忘れてしまう危険な可能性があります。したがって、不要なデカルト積で終わる可能性があります。 –

+1

ANSI 。 ANSI 89とANSI 92は、少なくともトピックの前の質問から取り上げたものです。 –

+0

内部結合の場合、両方の構文はSQL92のANSI標準です。 –

3

私は2番目のクエリを推奨します。なぜなら、それはよりよく見え、データベースロジックを反映しているからです。ほとんどのSQLサーバーでは、両方のSQL Serverがまったく同じクエリプランを生成するので、パフォーマンスは同じにする必要があります。

+0

は、データベースの論理手段を反映していますか? –

+0

これは、where条件が論理的には実際の "フィルタ"ではなく結合条件であるという点で、データベースロジックを反映していることを意味します。 – TomTom

0

を誰もが認識しているとおり、SQLクエリの実行のさまざまな段階があります。最初に実行されるのはFrom句で、結果セットはWhere句に渡され、Select句は最後にWhere句から返された一連の行から前述のフィールドのみを選択します。

最初のケースでは、クロス結合が実際に作成され、メモリに格納され、これらのレコードがWhere句に渡されます。これは、条件に一致しないレコードでさえ、結果セットに存在することを意味します。したがって、占有されるメモリの量はより多くなります。

2番目のケースでは、From句は条件に一致するレコードのみを保持し、結果セットをWhere句に渡します。レコードの数がかなり少なくなることは容易にわかります。

Select From A、Bは非常に古い構成であり、避けられない状況でのみ使用するために保持されています。 Join節はより良いパフォーマンスのために導入されたものであり、間違いなく選択肢になるはずです。

希望:

+0

私は本当にこれを期待しています。これを証明するための強力な証拠をいくつか共有してください。私は議論のために行く:) :) –

+0

あなたは何かを文書化していますか? –

+0

-1これはフラットな嘘です。 – NullUserException