• ベストアンサー

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.***

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

  • ベストアンサー
  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.2

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

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

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

すると、全ての回答が全文表示されます。

関連するQ&A