重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

where句内のselect副問い合わせは問い合わせの行数回行われると聞いたのですか本当でしょうか?
ベンダによって異なるのでしょうか?当方sqlserverは初めてでoracleをずっと使っていましたが聞いたことがなかったので。ベンダによって異なるなんてことはあるのでしょうか

以下の例でsqlserver2014で実際行ったところ確かにジョインした方が早いことがわかりました。
テーブルA 1件
テーブルB 2000件

【遅い例】
select 列1
from B
where B.列2 ≦ (select 列3 from A)

【早い例】
select 列1
from B inner join A
where B.列2 ≦ A.列3

質問者からの補足コメント

  • 早い例のwhereはonでした。記載誤りでした?

      補足日時:2017/05/26 22:45
  • すいません。補足の最後が?になってますが「。」の誤りです

      補足日時:2017/05/26 22:46

A 回答 (2件)

select 列1 from B WHERE B.列2 <= ANY(SELECT 列3 FROM A)


をやっていますね
エンジンにもよりますがこういったANYは相関サブクエリにならないので遅いんですよ
実際には連携状態をみるコマンドを利用しないと説明がつきませんが
sqlserverの仕様がよくわからないので説明できません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
where句に親SQLと結合しなくても相関サブクエリになってしまうことがあるのですね。

お礼日時:2017/05/28 21:18

インデックスがうまく効かないのでは?


特に遅い例のような書き方は一般的なSQLの文法としておかしいです
(たまたまAが1件しかないのでなんとか動きますが)
また早い方のjoin も接続条件の書き方がおかしいですよね?
whereではなくon?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
テーブルAは必ず1件しか無いと決まりきっているテーブルです。
確かにwhereではなくonですね。投稿時の誤りです。インデックスうんぬんは両方無しと考えてください。
遅い例で内部的にwhere句の問い合わせが件数分行われると聞いたのでそこが知りたいのです。

お礼日時:2017/05/26 22:44

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

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