31

2つのテーブルを結合する比較的単純なクエリがあります。「Where」基準は、結合基準またはwhere句として表すことができます。どちらが効率的か疑問に思います。

クエリは、セールスマンが最初から昇進するまでの最大売上を見つけることです。

ケース1

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
                  and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

ケース2

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

注ケース1には、where句がまったくありません。

RDBMSはSQLServer2005です

編集 結合基準の2番目の部分またはwhere句がsales.salesdate<ある固定日であった場合、2つのテーブルを結合する基準が実際にはないため、答えが変わります。

4

9 に答える 9

28

ここでは、パフォーマンスを決定要因として使用しません。正直なところ、これら2つのケースの間に測定可能なパフォーマンスの違いはないと思います。

私は常にケース#2を使用します-なぜですか?私の意見では、2つのテーブル間のJOINを確立する実際の基準のみをJOIN句に入れる必要があるため、他のすべてはWHERE句に属します。

物事をきれいに保ち、物事をそれらが属する場所に置くだけの問題、IMO。

明らかに、LEFT OUTER JOINの場合、基準の配置によって返される結果の点で違いが生じる場合があります。もちろん、これらのケースは私の推奨から除外されます。

マーク

于 2009-09-09T20:30:54.447 に答える
3

実行計画推定器と sql プロファイラーを実行して、それらが互いにどのように積み重なっているかを確認できます。

ただし、次の SQL Server MVP によると、内部では意味的に同じです。

http://www.eggheadcafe.com/conversation.aspx?messageid=29145383&threadid=29145379

于 2009-09-09T20:36:43.953 に答える
1

すべてのケースに当てはまる、これに対する有限の答えが見つかるとは思いません。この 2 つは常に互換性があるとは限りません。一部のクエリ (一部の左結合) では、WHERE と FROM の行に基準を配置することで異なる結果が得られるためです。

あなたの場合、これらのクエリの両方を評価する必要があります。SSMS では、これらの両方のクエリの推定実行計画と実際の実行計画を表示できます。これは、どちらがより最適かを判断するための最初のステップとして適しています。また、それぞれの時間と IO を表示することもできます (統計時間をオンに設定し、統計 io をオンに設定します)。これにより、決定を下すための情報も得られます。

あなたの質問のクエリの場合、どちらも同じクエリ プランで出てくると思います。したがって、この場合は問題にならないかもしれませんが、他のクエリでは異なるプランが生成される可能性があります。

これを試して、2つの違いを確認してください...

SET STATISTICS IO ON
SET STATISTICS TIME ON

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
       and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
where  sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

SET STATISTICS TIME OFF
SET STATISTICS IO OFF
于 2009-09-09T20:33:49.387 に答える
0

ばかげているように見えるかもしれませんが、答えは、クエリアナライザが最も効率的な計画を作成するクエリです。

私の考えでは、これらは同等のように見えるので、クエリアナライザーは同じプランを生成する可能性がありますが、テストする必要があります。

于 2009-09-09T20:30:12.577 に答える
0

どちらもより効率的ではありません.WHEREメソッドを使用することは、古い方法と見なされています( http://msdn.microsoft.com/en-us/library/ms190014.aspx )。実行計画を見ると、それらが同じことを行っていることがわかります。

于 2009-09-09T20:31:09.257 に答える
0

SQL Management Studio の推定実行計画に慣れましょう!! 他の人が言ったように、あなたが何をしようともアナライザーに翻弄されるので、その見積もりを信頼してください. あなたが提供した2つはまったく同じ計画を作成すると思います.

開発文化を変えようとしているのであれば、より良い計画を立てられるものを選んでください。同一のものについては、文化に従ってください

私は、このような他の「効率性」の投稿でこれについてコメントしました (それは誠実であり、皮肉でもあります)。これがボトルネックの場所である場合は、あなたとあなたのチームにハイタッチしてください。

于 2009-09-09T20:46:48.270 に答える