2009-08-24 24 views
1

に参加し、私は...(A)SQL ServerのSELECTのパフォーマンスがSQL Serverで

SELECT a.field1, a.field2, a.field3, b.field1 
FROM table1 a INNER JOIN table2 b ON a.IDfield = b.IDfield 

と、この(B)にこれを行うとの間のパフォーマンスの差があるかどうかを知りたいと思います...

SELECT a.field1, a.field2, a.field3, b.field1 
FROM table1 a, table2 b 
WHERE a.IDfield = b.IDfield 

これは簡単な例です。私はいくつかの4つの結合で作業しており、例Bのようにしています。それは悪い習慣ですか?私はそれを書く方が良い、読んでいる方が良いと思っていますが、パフォーマンス面ではそれ以上悪い場合はそれ以上は行いません。もちろん、私は左の結合を行うことはできません。右の結合はこの方法ですが、私が行っているクエリではそうではありません。ありがとう。

+2

簡単な答えはプロファイルすることです。 – rein

+0

@rein - 同意してください!あなたがプロファイルするまであなたは決して知らない。私は彼らが異なって行動するいくつかのケースを見た。 – Kirtan

答えて

6

いいえ違いはありません。最終的にa.IDfield = b.IDfield基準で両方のクエリがテーブルAとテーブルBの間のINNER JOINになるためです。

しかし、クエリ(A)は、あなたの意図を表現するのに非常に好ましい方法です。新しいクエリを書くときは、常にこのスタイルを使用してください!これはANSI SQL標準に記述されているスタイルなので、できるだけこのスタイルを使うほうがはるかに優れています。

私の経験を1としてマーク

+1

表示されるB構文は、ある時点ではサポートされません。ですから、Aバージョンの作成に慣れてください。また、いくつかのケースでは(私は何を覚えていないことができます)、B構文はプロダクションの結果が異なる場合があります。私はそれが右の結合と関係があると思う。 – mrdenny

+0

@MrDenny:良い点 - また、その構文に慣れることができないもう一つの良い理由! :-) –

1

、私はそれが依存していることだと思います!

SQL Serverオプティマイザーは、実際には神秘的なのものです。理想的には、2つの構文の間に違いはありません。しかし実際にはJOINというキーワードを使用するべきです。

は、実行時の条件によっては、SQL ServerオプティマイザMAYは、2番目のクエリは、その逆の最初の1かよりも高速に実行するようにしてください。それはすべて依存している。クエリ実行計画を使用してREALLYを実行すると、最適なクエリが実行されます。

+0

私はこのケースに依存しているとは思わない - どちらの場合も、単純で直接的な基準(a.IDfield = b.IDfield)があり、どちらも真っ直ぐなINNER JOINsになる。 –

+1

あなたは正しい、それらは同じです。しかし、一般的には、クエリの実行計画を見て、より良いクエリが実行されるかどうかを確認することをお勧めします。 – Kirtan

+0

合意 - しかし、このサンプルは実行プランを見なければならないのはあまりにも簡単です:-) –

1

私は決して2番目の構文を使用しません。多数の結合があると、誤ってクロスジョインする可能性が非常に高くなります。最初のものはメンテナンスのためにはるかに明確です。そのスタイルに沿った左右の結合構文は、SQl Serverでは正しく機能せず、中止されています。

私の意見では、2番目の構文を使用するのは非常に貧しい方法です。それだけで17年古いです。

1

他のすべてが等しい(同じdb、同じインデックス、同じ統計、MDOP設定)場合、パフォーマンスは2つのクエリに違いはありません。

あなたが実行することで、これを見ることができます: ON

のSET SHOWPLAN_TEXT GO

SELECT a.field1、a.field2、a.field3、b.field1FROM TABLE1 INNERがa.IDfield ON table2のbを登録しよう= b.IDfield GO

SELECT a.field1、a.field2、a.field3、b.field1FROM TABLE1 A、table2のbWHERE a.IDfield = b.IDfield あなたはWILの上に実行した後

をGO実行計画は実際には2つのクエリで同一であることがわかります。

また、管理スタジオのステートメントを強調表示し、右クリックして「実際の実行計画を含める」を選択すると、同じことをグラフィカルに表示できます。

関連する問題