JOIN句の記述方法の違いによるパフォーマンスへの影響とは?

このQ&Aのポイント
  • Ex1とEx2のJOIN句の記述方法の違いは、クエリのパフォーマンスに影響する可能性があります。
  • ただし、2万件程度のデータ量では明確なパフォーマンスの違いは確認できませんでした。(1秒〜2秒)
  • 単純に書き方の違いであれば、自分がわかりやすいと感じるEx1の記述方法で統一することもできます。
回答を見る
  • ベストアンサー

JOIN句の記述の違いによるパフォーマンスへの影響

以下のEx1,2のJOIN句の記述方法の違いはクエリのパフォーマンスに影響するのでしょうか? 2万件程度のデータ量で試してみたのですが明確なパフォーマンスの違いを確認できませんでした。(1秒~2秒) 単純に書き方だけの違いであれば心置きなく自分ではわかりやすいと感じているEx1の記述方法で統一したいので。 よろしくお願いします。 -- /* SQL Server 2008 R2 */ -- /* 受注した全ての商品名を取得するクエリ(例) */ -- /* 登場テーブル・カラム */ -- // M_goods 商品マスタ -- // code 商品コード -- // name 商品名 -- // T_orders 受注テーブル -- // number 受注番号 -- // T_orderdetails 受注明細テーブル -- Ex.1 SELECT M_goods.name FROM T_orders LEFT JOIN T_orderdetails ON T_orders.number = T_orderdetails.number LEFT JOIN M_goods ON T_orderdetails.code = M_goods.code -- Ex.2 SELECT M_goods.name FROM T_orders LEFT JOIN T_orderdetails LEFT JOIN M_goods ON T_orderdetails.code = M_goods.code ON T_orders.number = T_orderdetails.number

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

グラフィカル実行プランの表示 (SQL Server Management Studio) http://technet.microsoft.com/ja-jp/library/ms178071(v=sql.105).aspx 同じ実行プランであれば、差はありません。

bbs_silva
質問者

お礼

迅速かつ適切なご回答ありがとうございました。 推定実行プランを行ったところ、Ex1,2のクエリは共に全く同じ実行プランでした。

関連するQ&A

  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • ~JOIN ON句でこのような問い合わせはできるのでしょうか?

    SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard

    • ベストアンサー
    • MySQL
  • WHERE句で結合。INNER JOINとの違い

    MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…

    • ベストアンサー
    • MySQL
  • どちらのLEFT JOINが早いでしょうか?

    下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?

    • ベストアンサー
    • MySQL
  • JOIN 句の書き方について

    毎度お世話になっております。 以下のテーブルの内容があります。 ・テーブル1 フィールド1     a ・テーブル2 フィールド1   親   子   孫     1     a     なし   なし     2    なし    a   なし     3    なし   なし    a     4    なし   なし   なし ここで、テーブル1.フィールド1の内容を含む テーブル2の行を抽出したいのです。 ・希望する結果 フィールド1   親   子   孫    1   a   なし   なし    2   なし   a   なし    3   なし   なし   a 以下のSQL文を作成したところ希望する結果になりましたが、 ONの中にORを書いてもよいのでしょうか。 それともUNIONクエリにすべきなのでしょうか。 SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル1 LEFT JOIN テーブル2 ON (テーブル1.フィールド1 = テーブル2.孫) OR (テーブル1.フィールド1 = テーブル2.子) OR (テーブル1.フィールド1 = テーブル2.親); よろしくお願いします。

  • ACCESS での LEFT JOIN 時の WHERE 句の使用について

    以下のテーブル1、テーブル2で、 テーブル2のDATE2が、テーブル1のDATE以前になっている VOL2を集計したいと考えています。 テーブル1 CODE   DATE     VOL --------------------------- a     20080601  100 a     20080602  100 a     20080603  100 テーブル2 CODE   DATE2    VOL2 ------------------------ a     20080602   50 a     20080603   50 希望する結果のイメージ CODE   DATE     VOL    VOL2 --------------------------------------- a    20080601   100     0 a    20080602   100     50 a    20080603   100    100 以下のSQLを考えましたが、DATE以前のDATE2を持たない場合、 テーブル1の行が表示されませんでした。 SQL文 SELECT t1.CODE, t1.DATE, t1.VOL , Sum(t2.VOL2) AS VOL2の合計 FROM テーブル1 as t LEFT JOIN テーブル2 as t2 ON t1.CODE = t2.CODE WHERE t1.DATE >= t2.DATE2 GROUP BY t1.CODE, t1.DATE, t1.VOL 結果 CODE   CDATE   VOL   VOL2の合計 -------------------------------------- a    20080602  100    50 a    20080603  100   100 SQL文中にある WHERE t1.DATE >= t2.DATE2 が原因しているのではと考えています。 しかし、どのようにしたらよいのかがわかりません。 どなたか、ご教授をお願いします。

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • JOINの方法について

    毎度お世話になっております。 以下のテーブル1、テーブル2があります。 [テーブル1] CODE   1月  2月  A      10  10  C      30  30 [テーブル2] CODE   3月  4月  A      10  10  B      20  20  D      40  40 これを以下のようにくっつけたいのです。 [希望する結果] CODE   1月  2月  3月  4月  A      10  10  10  10  B             20  20  C      30  30  D             40  40 クエリ1(テーブル1 LEFT JOIN テーブル2とする)と、 クエリ2(テーブル2 LEFT JOIN テーブル1とする)を作り、 UNIONでくっつける方法を考え、希望した結果は得られましたが、 もっとスマートな方法(一つのクエリでできるような方法)が あればご教授ください。

  • left join が3つ以上のとき

    例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。