アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の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.***

A 回答 (2件)

>以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。


>先に抽出して結合した方が良いと昔聞いた事がありましたが

ルールベースの場合の話かも知れません(9i以前なら使用可能)
コストベースオプティマイザを使用すると、内部結合のON条件とWHERE句とを同等に解析してくれるので、特に書き方来る性能差はないと考えればよいです。

(1)と(2)についてですが、「実行計画」をそれぞれ表示して比べてみてください。autotraceもよいですね。おそらく同じような結果が出ると思うのですが、基本的には(2)のような書き方はあまりすべきではありません。コストベースオプティマイザによる最適実行計画立案を妨げる恐れがある書き方だと思います。(もっと複雑なSQLだと、特に)
常に(1)のような書き方を心がけ、ベストの実行計画が出にくい場合にヒント句で調整するのが一番よい方法です。
    • good
    • 1

(2)の方がパフォーマンスがよいかと思うのですが、


実際は、データの分布状況にって、オプティマイザ判定が変わります。
クエリの推定プラン等をみるのが一番てっとり早いです。

昔似たような件を調べたら、(1)と(2)は同じプランを生成してました。
その時は、EXISTSを使った構文(3?)が1番早かったですが。。。(SQLserver)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A