• ベストアンサー
  • 困ってます

WHERE句はJOIN結合前結合後どちらに効くのか

以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 先に抽出して結合した方が良いと昔聞いた事がありましたが 記憶があいまいになってしまいました。 (1) SELECT * FROM A JOIN B ON A.*** = B.*** WHERE A.*** = '0001' (2) SELECT * FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B ON A.*** = B.***

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数15828
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2

>以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 >先に抽出して結合した方が良いと昔聞いた事がありましたが ルールベースの場合の話かも知れません(9i以前なら使用可能) コストベースオプティマイザを使用すると、内部結合のON条件とWHERE句とを同等に解析してくれるので、特に書き方来る性能差はないと考えればよいです。 (1)と(2)についてですが、「実行計画」をそれぞれ表示して比べてみてください。autotraceもよいですね。おそらく同じような結果が出ると思うのですが、基本的には(2)のような書き方はあまりすべきではありません。コストベースオプティマイザによる最適実行計画立案を妨げる恐れがある書き方だと思います。(もっと複雑なSQLだと、特に) 常に(1)のような書き方を心がけ、ベストの実行計画が出にくい場合にヒント句で調整するのが一番よい方法です。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • from...where を from...join..on にするには

    以下のSQL文は from ... where ... で書かれていますが これを from ... join ... on ... で書き直したいのですが可能でしょうか? select X.col1, U.col1 from TABLE_X as X ,TABLE_U as U where U.REC_NO = (select B.REC_NO from TABLE_A as A, TABLE_B as B where A.ITME = B.ITEM and X.DATA = A.DATA fetch first 1 row only ) むずかしくしているのは、fetch first 1 row only なのですが これがないと where句のかっこのなかのselect文は複数の結果を返します しかし、その複数の結果はすべて同じものになることがデータ上保証されています 。 fetch first を除いて select distinct としても同じ結果となりますが パフォーマンスがひどく低下してしまいます。

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • inner joinとwhereでの結合の違いは?

    お世話になります。 たとえば、テーブルが複数(この場合2つ)ある場合。 (1) test(カラム:table_id,table_name) (2) tester(カラム:table_id,table_name) 以下のクエリは条件的に select a.table_id, a.table_name from test a inner join tester b on a.table_id = b.table_id ************* select a.table_id, a.table_name from test a , tester b where a.table_id = b.table_id 同じですよね? パフォーマンス的にもjoinすることのメリットが判りません。

その他の回答 (1)

  • 回答No.1
  • YEND77
  • ベストアンサー率56% (21/37)

(2)の方がパフォーマンスがよいかと思うのですが、 実際は、データの分布状況にって、オプティマイザ判定が変わります。 クエリの推定プラン等をみるのが一番てっとり早いです。 昔似たような件を調べたら、(1)と(2)は同じプランを生成してました。 その時は、EXISTSを使った構文(3?)が1番早かったですが。。。(SQLserver)

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Accessの表結合SQL

    AccessのSQLで外部結合を複数使うと SQLがエラーになります。 クエリで確認してエラーにならない様につくってみましたが、意図する事をやろうとするとエラーになります。 どこが悪いか教えていただけませんか?おそらくSQLサーバーでは余裕で通るSQLだと思うのですが。。。 SQL = SELECT * FROM T1 LEFT JOIN T2 ON T1.A = T2.A LEFT JOIN T3 ON T1.B = T3.B LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' やりたいのはT1を基準にT2,T3,T4からデータを引っ張ってきたい。その条件としてT4から引っ張ってくるのは T4.DがiNumである事、基準となるT1のT1.EがiNumである事です。 Accessでは"AND T4.D = iNum"がだめで、 WHERE区に書くと外部結合にもかかわらずT4.D = iNumのデータしか抽出されなくなる。(T1.C = T4.CのデータがT4.D = iNumでなくてもT1のデータが抽出されなくてはならない。) さらに SQL = SELECT * FROM ((T1 LEFT JOIN T2 ON T1.A = T2.A) LEFT JOIN T3 ON T1.B = T3.B) LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' こんな括弧が必要になってくる。 これだとT1とT2を外部結合した結果をT3と外部結合して さらにその結果をT4と外部結合しているという意味あいになってしまって、意図が違うのですが。。 結果は同じなのでAccessに譲ってやってもいいのですが 前者はT1で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。

  • WHERE句で結合。INNER JOINとの違い

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

    • ベストアンサー
    • MySQL
  • INNER JOINとwhere句

    等結合のSQLを書く必要が出てきた場合、 INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか? 私は、結合表の数が多くなってくると INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。 (何より、WHEREのほうが構文が簡単で・・・。) よろしくお願いします。

  • 少し複雑な 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 "; よろしくお願いします。

  • update文におけるwhereとjoinの違いについて

    はじめまして。 副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。 使用しているDBはORACLE10gです。 SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。 ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。 whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのかがわかりません。 どなたかご教示いただけないでしょうか。 【1】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES INNER JOIN SALARY s ON EMPLOYEES.EMPLOYEEID = s.EMPLOYEEID) 【2】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES WHERE SALARY.EMPLOYEEID = EMPLOYEES.EMPLOYEEID) 説明不足の点があればご指摘ください。よろしくお願いします。

  • VIEWに対してWHERE句をつける

    SQLでVIEWを作成し、そのVIEWに対してSELECT文を書くときに、そのVIEWに対してWHERE句をつけるのは、パフォーマンスを必ず下げることになるのでしょうか?勝手な認識ですが、VIEWにWHERE句をつけると遅くなる場合があると聞きました。VIEWの組み方にももちろんよると思いますが、VIEWは消極的に使い、出来る限りJOINなどして結合したSQLを書くほうが無難なのでしょうか?よろしくお願いいたします。

  • テーブル結合について、下記SQLをANSI結合の書き方で表したい。

    テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key

  • sql(left join)の結合条件のルール

    (テーブルA)と(テーブルB)をleft joinした際の結合条件について 詳しい方に伺いたいのですが、 on以下の部分は、(テーブルAの中にあるカラム)と(テーブルBの中にあるカラム)を 比較するような文でなければいけないですか? 例えば、、、 ------------------------------------------------------------------------- SELECT * FROM  timeTpl2 AS t LEFT JOIN booked AS b ON  t.start = b.startTime AND  b.settingDay = $day ------------------------------------------------------------------------- 上記の最後の部分(b.settingDay = $day)は テーブルbにしかない要素を変数($day)と比較しています。 ◆疑問 記述としてだいじょうぶかどうかを知りたいです。 つまりon以下結合条件は必ず左右のテーブルの、存在するカラム のみしか比較する事ができないかどうかが知りたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL