• ベストアンサー

ANDの順番とGROUP BYについて

where句で、ANDを複数の項目指定する場合、項目の順番により検索速度は異なるのでしょうか? 又、GROUP BYを行う項目はインデックスを付けた方が検索速度は上がるのでしょうか?

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

  • ベストアンサー
  • TMINET
  • ベストアンサー率32% (45/140)
回答No.2

Where句の順番はかなり影響しますね。 SQLの解析は後ろからされますので、絞込みによる結果の件数が少なくなる条件を後ろの方に持っていくと速くなります。 IndexはGROUP BY項目よりWhere項目に付けた方が効果が期待できるのではないでしょか。

その他の回答 (1)

  • arara0123
  • ベストアンサー率47% (8/17)
回答No.1

あくまで「一般的に」、ではありますが > 1.where句で、ANDを複数の項目指定する場合、項目の順番により検索速度は > 異なるのでしょうか? 異なる可能性大。 > 2.GROUP BYを行う項目はインデックスを付けた方が検索速度は > 上がるのでしょうか? 上がる可能性大。 可能ならばそれぞれのケース試してみることをお勧めします。 もちろんお使いになるDBMSや実際のテーブル(件数等)によって 結果は異なりますので・・・

関連するQ&A

  • SQLチューニング

    教えて下さい。 検索文のWHERE句を設定、 (1)INDEX付きの項目を1つだけ指定する。 <例>WHERE 項目a = 'a' --対象件数少 (2)INDEX付きの項目を複数個指定する。 <例>WHERE 項目a = 'a' --対象件数少 AND 項目A = 'A' --対象件数多 どちらが検索速度は速いのですか? ご解答よろしくお願いいたします。

  • select文でGROUP BYの正しい使い方

    下記のselect文は問題ないでしょうか?テーブルには5つのフィールド(id,name,age,gender,office)が存在します。 select * from テーブル名 where age >= '40' GROUP BY gender 実際に試したところ、うまく動いているのですが、GROUP BY句で指定されたフィールド名はSELECT句のフィールド指定をすべて含んでいなくてはならないと書かれているのを見つけました。 上記のselect文は正しいのでしょうか。

    • ベストアンサー
    • PHP
  • 検索条件が複数の場合のインデックスの張り方

    Mysql5.0 + ASP.NETで開発中です。 サーバーはWindows2003サーバーです。 とある検索サイトを作っていますが、1テーブルのフィールド数が80くらいあります。 また、レコード数は常時100万件程度です。 このテーブルの検索を行うときに、ユーザーが任意の検索条件を設定できるような画面なのですが、実際に検索に使用されるフィールド数は最大で10です。 例えば、where a = 999 and b = 999 や where a = 999 and c = 999 and f = 999 や where b = 999 and d = 999 and f = 999 and g = 999 など、where句で使用されるフィールドがユーザーの指定により常に異なります。(999は任意の値です) ORDER BYに使用されるフィールド数は3です。 現状ではインデックスは張っていないため、かなり検索速度が遅いため、インデックスを張りたいのですが、どのような張り方がいいのかがわかりません。 このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 1.検索に使用される10つのフィールドに1つずつ張ればよい 2.検索に使用される10つのフィールドとソートに使用される3つのフィールドに1つずつ張ればよい 3.where句の組み合わせを全て考えて複合インデックスを張る必要がある。 4.その他 また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか?

  • GROUP BY で列名は指定できないの?

    いつもお世話になっております。 SQLで GROUP BY を使うときに SELECT部分で指定した 列名を指定したいことがよくあると思います。 列名を指定する方法はないのでしょうか? 例) SELECT 項目A, CASE WHEN 項目B = 1 THEN '○' WHEN 項目B IN (2,3) THEN '×' END AS 丸バツ, SUM(数量) FROM TABLE GROUP BY 項目A, 丸バツ こんな風にGROUP BYで指定したいのですが・・・。

  • WHERE句の条件の記述の順序

    PRIMARY KEYとINDEXがテーブルに設定されている場合、 検索条件に記述する順番はどのようになるのでしょうか? 下記のテーブルがあり、SELECT文をつくろうと 考えています。 テーブル:foo 項目  PRIMARY KEY  INDEX ----------------------------------- a 1 b 2 1 c 3 d 2 (1)PRIMARY KEYを優先してWHERE句の順番を決める↓ SELECT * FROM foo WHERE a = "AAA" AND b = "BBB" AND c = "CCC" AND d = "DDD" (2) それともINDEXが設定されている項目を先に記述する↓ SELECT * FROM foo WHERE b = "BBB" AND d = "DDD"   AND a = "AAA" AND c = "CCC" (1)と(2)ではどちらの性能がよいのでしょうか?

  • group by とhaving

    こんにちは。 グループ化した後に条件で摘出する方法について教えて頂けますでしょうか。 例えば、以下のようなテーブルを作ったとして、 テーブル id tag_no 1 5 1 6 1 7 1 8 1 9 2 5 2 10 2 11 3 5 3 9 3 10 指定したtag_noを持つidを摘出したいのですが、tagnoを複数指定するのにはどのようにしたらよいのでしょうか・・・。 select table from group by id having tag_no = 5 and tag_no = 9; として、 idの1と2を取り出す・・・といったことをやりたいのですが、 実際にやってみるとempty setとなります。 このテーブルで無理ならテーブルの変更もありなのですが、 一晩悩んでも思い浮かばず・・・。 mysqlはvar5.5です。 お力添えをよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • SQLServerのGROUP BYについて

    SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

  • 複数項目の一括検索

    SQLで、指定したキーワードで指定した複数の項目についてすべて検索したいと思います。 ※たとえば 項目1~項目10を持つテーブルのうち、 項目1、項目3、項目5、項目8のいずれかに"データ"という文字を含むレコードを抽出する (項目の選択はユーザ任意です) この場合、WHERE句でANDでつなげればよいのでしょうが、これが果たして効率や、プログラムソースコードの美しさからいって、ベストなのか迷ってます。 こういった場合の常套手段がありましたら教えてください。

  • SQL WHERE, HAVING について

    こんにちは。さっそくですが、 白男川 恵さん著作による 「Oracle Master Bronze 演習問題 SQL基礎I」 の問95について質問させていただきます。 問題文 CAT_ID列の値が20であるPRICE列の最大値を求めたい。 実行すべきSQL文として正しいものを選びなさい。 とあり、正解は (B) SELECT cat_id, MAX(price) FROM itemlist HAVING cat_id = 20 GROUP BY cat_id (C) SELECT cat_id, MAX(price) FROM itemlist WHERE cat_id = 20 GROUP BY cat_id なのですが、 WHERE句の使用法としては 大体の場合 WHERE (ターゲット) = (値) となると思うのですが、ターゲットのところが グループ関数でないのでこの場合は正解としてもよい、 ということでしょうか? 以下のサイトを別のタブで見ていただきたいのですが、 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_1.html 「WHERE句とGROUP BY句を併用した場合、 WHERE → GROUP BYの順でクエリが評価されるため、 グループ化された結果をWHERE句の段階で利用できないのです。」 「HAVING句とGROUP BY句を利用した場合、 GROUP BY → HAVINGの順でクエリが評価され、 グループ化された結果に対し条件を指定することが可能です。」 http://www.atmarkit.co.jp/fdb/rensai/tsql05/tsql05_2.html 「HAVING句はGROUP BY句によってグループ化が行われたデータに対し、 絞り込みの条件を指定できます。 このため、絞り込み条件に集計関数を含めることが可能です。」 この設問の場合には WHERE→GROUP BYの順でも GROUP BY→HAVING の場合でもWHERE のターゲットがグループ関数で得られた値 で条件指定するわけではないので文法的にも正しく おなじ結果が得られる こういう解釈でよろしいのでしょうか? ご存知の方、教えていただけないでしょうか? よろしくお願いします。

  • なぜ、WHERE句とHAVING句があるのか?

    なぜ、WHERE句とHAVING句があるのか? SQLを学んでいる時に、疑問に思ったことがあります。 それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。 この2つは、 ・WHERE句 → 表から取り出す行の条件を指定 ・GROUP BY句 → グループ化した結果から取り出す行の条件を指定 という違いがあることは分かっています。 ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、 なぜ、わざわざ2つに分ける必要があったのでしょうか? 分けないと不都合が生じるのでしょうか。 もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。