none
WHERE句とINNER JOINでの抽出時のパフォーマンス RRS feed

  • 質問

  • こんにちは。
    SQLServer2005の
    レコードの抽出機能時のパフォーマンスについて質問です。

    レコードの抽出には通常Where句を使用すると思うのですが
    Inner Joinにも同様の効果があるかと思います。

    【例】
      ・Where句
      Select *  From T1 Inner Join T2 On T1.AAA =T2.AAA  Where  T1.BBB = "hoge"

      ・Inner Join
       Select *  From T1 Inner Join T2 On T1.AAA =T2.AAA  And T1.BBB = "hoge"

    抽出条件という意味であればWher句を使用したほうが分かりやすいかと思いますが
    パフォーマンス的にはどちらが優れているのでしょうか?
    2008年8月7日 7:43

回答

  • Microsoft SQL Server Management Studio のクエリペインで、「実際の実行プランを含める」というボタンをクリックした後に、下記を実行してみました。

     

    use AdventureWorks

    select * from HumanResources.Employee T1 inner join HumanResources.JobCandidate T2 on T1.EmployeeID = T2.JobCandidateID where T1.ManagerID = 185


    select * from HumanResources.Employee T1 inner join HumanResources.JobCandidate T2 on T1.EmployeeID = T2.JobCandidateID and T1.ManagerID = 185

    「結果」とともに「実行プラン」が表示されますが、見てみたところ、実行パスも、クエリコストも同様でした。Clustered Index Scanも共に行われています。

     

    実行プランが同じであれば、どちらを使っても問題ないと思いますが、はデータの量や、統計、または抽出条件によっては実行プランが変わることもあると思いますので、ポルポルさんの環境で、「実行プラン」を都度比較してみて、決めるのがよいかと思います。

     

    2008年8月7日 22:30

すべての返信

  • Microsoft SQL Server Management Studio のクエリペインで、「実際の実行プランを含める」というボタンをクリックした後に、下記を実行してみました。

     

    use AdventureWorks

    select * from HumanResources.Employee T1 inner join HumanResources.JobCandidate T2 on T1.EmployeeID = T2.JobCandidateID where T1.ManagerID = 185


    select * from HumanResources.Employee T1 inner join HumanResources.JobCandidate T2 on T1.EmployeeID = T2.JobCandidateID and T1.ManagerID = 185

    「結果」とともに「実行プラン」が表示されますが、見てみたところ、実行パスも、クエリコストも同様でした。Clustered Index Scanも共に行われています。

     

    実行プランが同じであれば、どちらを使っても問題ないと思いますが、はデータの量や、統計、または抽出条件によっては実行プランが変わることもあると思いますので、ポルポルさんの環境で、「実行プラン」を都度比較してみて、決めるのがよいかと思います。

     

    2008年8月7日 22:30
  • blink!様
    返信ありがとうございます。

    Microsoft SQL Server Management Studio のクエリペインに、「実際の実行プランを含める」
    というのがあり、実行プランがグラフィカルに表示されるということを知りませんでした。

    早速こちらの環境で比較を行い検討します。

    ところで抽出時は一般的にはどちらを利用されることが多いのでしょうか?(Where句 or Inner Join)
    都度比較してパフォーマンスを検討するのがよいとは思いますが、一般的には
    大半はこちらがいいというようなことは無いのでしょうか?
    2008年8月7日 23:48