SQL SERVER の Where条件によるSQL実行スピードへの影響とインデックスの利用

このQ&Aのポイント
  • SQL SERVERのWhere条件によるSQL実行スピードへの影響とインデックスの利用について教えてください。
  • VB内でSQL文を作成する際に、Where条件を都度判断してプログラムを書いていますが、この方法がSQL実行スピードに影響を与えることやインデックスの利用に問題を引き起こす可能性があるのでしょうか。
  • SQL SERVERのWhere条件によるSQL実行スピードとインデックスの利用について詳しく知りたいです。
回答を見る
  • ベストアンサー

SQL SERVER の Where条件

初めて質問させて頂きます。 VB内でSQL文を作成し、それをSqlServerに送り実行させているのですが、 VB内でSQL文を作成する時に、Whereの条件を入れたり入れなかったりします。 その時、都度、WhereをつけるのかAndをつけるのか判断してプログラムを書くのが億劫なので Dim SqlString as string SqlString = "SELECT * FROM テーブルA WHERE 0 = 0" IF txtA.text <> "" then SqlString = SqlString & " AND 項目A = " & txtA.text END IF IF txtB.text <> "" then SqlString = SqlString & " AND 項目B = " & txtB.text END IF こういうズボラをしてるのですが、これってSqlの実行スピードに影響したりしますか? 思うようにインデックス使ってくれなかったりしますか? ご存知の方がご教授下さい。 よろしくお願いします。

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

  • ベストアンサー
  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

いや、ごく普通のSQLのWHERE句の作成方法でしょう。 但し、テキストボックスの値を直接SQL文に展開するとSQLインジェクションと言う不正アクセスの原因になるので、そこは考え直した方がいいです。 SQLの実行速度はSQL文の書き方に依存するようでは、まともなDBエンジンとは言えないのですが、そう言うことがあるのは事実です。

hiyoko-piyoyo
質問者

お礼

回答ありがとう御座います。 皆さん、やっている事だと聞いて安心しました。 因みに、SQLインジェクションはテキストボックスをユーザーコントロールにして入力値を制御しているので大丈夫だと思います。 ご指摘ありがとう御座います。

その他の回答 (1)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

気になるのであれば、実際に確認してみましょう。 意味のない条件は、SQL解析エンジンが無視してくれる可能性は高いです。 実際に「実行のクエリプランを含める」をチェックして結果を確認して下さい。 ※環境依存なので絶対に無視するとは言い切れません。 それで問題なければ、いいんじゃないですか? 性能試験を行って問題ないことを確認しているのであればOKだと思いますよ。

hiyoko-piyoyo
質問者

お礼

回答ありがとう御座います。 ごもっともなご指摘です。

関連するQ&A

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • SQL文 Where句の複数検索

    先日教えて頂いたところから自分なりに複数検索をする方法を考えて書いてみたのですが、これだとテキストボックスに複数検索条件を入力するとSQLの構文エラーになってしまいうまくいきません。 先日教えて頂いた方、見ていたらまたアドバイスを頂けたら助かります。 Private Sub コマンド11_Click() '変数の設定 Dim myDB As DAO.Database Dim myRS As Recordset Dim strCnd As String Dim strWhr As String Dim strSQL As String '定数の宣言 Const conSQL As String = "Select * From T_障害票マスタ" ' テキストボックスの値を確認 ' Nz関数を使用して、テキストとして扱える空文字に変換 strCnd = Nz(Me!テキスト1, "") '←◆コントロールの値を参照◆ '「テキスト1」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " " & strWhi & " 起票日 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト3, "") '←◆コントロールの値を参照◆ '「テキスト3」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " And 依頼者 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト5, "") '←◆コントロールの値を参照◆ '「テキスト5」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " And 部署 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト7, "") '←◆コントロールの値を参照◆ '「テキスト7」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & "And 社員番号 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト9, "") '←◆コントロールの値を参照◆ '「テキスト9」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & "And 対象システム Like '*" & strCnd & "*'" End If 'SQL文を作成 strSQL = conSQL & vbCrLf & strWhr '自身のレコードソースに設定 Me.RecordSource = strSQL '検索結果の表示 DoCmd.OpenForm ("データ修正画面") Forms("データ修正画面").RecordSource = strSQL

  • [VB6] SQLの作成について

    お世話になります。 VB6でSQL文字列を作成しております。 そこで質問させていただきたいのですが、 画面のテキストボックスに入力した値(txtName.textおよびtxtKatakana.text )が空かどうかに応じて、 SELECT文のWHERE句の内容を変えたいのですが。 (現ソース) sSQL = "" sSQL = sSQL & "SELECT * FROM TABLE名" If txtName.text <> "" AND txtKatakana.text <>"" Then sSQL = sSQL & "WHERE 名前= ' " & txtName.text & " ' " sSQL = sSQL & " AND カタカナ= ' " & txtKatakana.text & " ' " ElseIf txtName.text <> "" AND txtKatakana.text = "" Then sSQL = sSQL & "WHERE 名前= ' " & txtName.text & " ' " ElseIf txtName.text = "" AND txtKatakana.text <> "" Then sSQL = sSQL & " WHERE カタカナ= ' " & txtKatakana.text & " ' " 何か他に良い方法がありましたら、 教えていただけないでしょうか? よろしくお願いいたします。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • 特定条件でWHERE句の条件を変更したい

    @jouken int @sql varchar(MAX) @select varchar(MAX) @where varchar(MAX) set @select = 'select * from table1' set @where = ' where case when @jouken = 0 then 'field1 = 1' when @jouken = 1 then 'field1 = 1 or field2 = 1' when @jouken = 2 then 'field1 = 1 or field2 = 1 or field3 = 1' end ' set @sql=@select+@where exec(@sql) 上記のような文字列の組み合わせでの作成でやりたいことはできたのですが、 こちらを直接SQLの中でやりたいのです。 以下の文は機能しません。 select * from table1 where case when @jouken = 0 then field1 = 1 when @jouken = 1 then field1 = 1 or field2 = 1 when @jouken = 2 then field1 = 1 or field2 = 1 or field3 = 1 end ご教授の程、よろしくお願い致します

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • SQL whereの中のif文について

    SQLの中にif文を使いたいですが、 うまくいきません。 やはりwhereの中で使えないですか? アドバイスお願いします。 実際のSQL文: $sql = "select * from room";     $sql = $sql . " WHERE ((Keisai = 1)"; if(Chinryou1>0){ $sql = $sql . " and (Chinryou1 <= {$rent1})";     }else if(Chinryou1==0){ $sql = $sql . " and (Chinryou2 <= {$rent1})";    } $sql = $sql . ")"; $sql = $sql . " order by Narabijun desc, Name"; $sql = $sql . ";"; $result = mysql_query($sql, $conn); $num = mysql_num_rows($result);

    • ベストアンサー
    • MySQL
  • SQL Server Where句 Case文

    お世話になります。 Where句のCase文でお尋ねしたいことがあります。 ----------------------------------------------------- WHERE (A = @A) AND (B = @B) AND (C = @C) AND CASE WHEN @D = 0 THEN (dbo.TEST.D = dbo.TEST.D) '全データを WHEN @D = 1 THEN (dbo.TEST.D = 1) '値が1のデータを WHEN @D = 2 THEN (dbo.TEST.D = Is Null) 'データがNull のものを END AND (E = @E) AND (F = @F) AND (G = @G) AND (H = @H) AND CASE WHEN @I = 0 THEN (dbo.TEST.I = dbo.TEST.I) WHEN @I = 1 THEN (dbo.TEST.I = 1) WHEN @I = 2 THEN (dbo.TEST.I = Is Null) END AND (J = @J) ........ ........ ----------------------------------------------------- 上記のように CASE 文で パラメータの値により条件を変えたいのですが、なかなかうまくいきません。こんな記述の仕方ではダメということは薄々わかっているのですが、このようなCASE文をうまく動作させるにはどのように記述すればいいでしょうか? よろしくお願いいたします。

  • VB.NETでSQLを作る時のカンマの対処

    こんにちは。 タイトルの通りなのですが、VB.NETでSQL文を作りたいのですが、カンマの対処について分からなかったので質問させて頂きました。 例えば、下記のようなテーブルとwindowsアプリケーションフォームがあったとします。 itemテーブル                 フォーム(□はチェックボックスだと思ってください。) item_id  item_cd  item_name        □ りんご ---------------------------------       □ ばなな 0001    0001    りんご        □ みかん 0002    0002    ばなな        □ めろん 0003    0003    みかん 0004    0004    めろん このフォームで、チェックボックスに印が付いているものを、SQL文の条件に加えたいと思っていますが、なかなか上手く書けません。 現在のソース sql="SELECT item_id,item_cd,item_name " _   & "FROM item " _   & "WHERE item_name IN (" If apple.checked = True Then   sql &= "'" & label1.text & "'," End If If banana.checked = True Then   sql &= "'" & label2.text & "'," End If         ・         ・         ・ このやり方だと、sql文の最後にカンマが残ってしまいます。 ですが、前カンマをやったところで構文的におかしくなってしまいます。 このようなとき、どのように対処すればよいのでしょうか? よろしければ、教えてください。