• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLの高速化の方法について)

SQLの高速化の方法

nora1962の回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

.> 一応自分でも調べててWHERE句では結合よりも先に条件を記載する方が良いとか書いてました。 > あと、IN演算子がちょっと問題な演算子ということが。 結合処理については、駆動表の絞り込みが出来るのならそこで件数を絞り込みを行うのは有効です。 しかし、絞り込みでそんなに件数が減らない場合、駆動表・内部表ともにWHERE条件を先に適用させるSQLは結合にINDEXが使えないので逆に遅くなる可能性があります。 ここらあたりはテーブル構造やデータの状況にもよるので一般論はありません。 IN句は意味的にOR条件と等値です。後はRDBMSの実装しだいですが、場合によってせっかくINDEXが使えるような場面でも、IN句の場合全表検索を選択する傾向があるのも事実です。 > WHERE AAA IN ('122','244','366') のような場合、オプティマイザがどのような実行計画を選択するかは場面によって違うと思いますが、テクニックとしては ( SELECT '122' UNION ALL SELECT '244' UNION ALL SELECT '366' ) AS Q のような副問合せ(インラインビュー)を作り、結合処理に変換することでパフォーマンスが上がる場合もあります(AAAにINDEXがある場合) > GROUP BY AA.A1 HAVING COUNT(*) >= 0 > といった処理も重くしてしまうのでしょうか? すみません、この条件の意味がよく分かりません。 「GROUP BY AA.A1」で「COUNT(*)」が返す値はゼロ以上以外にあるのでしょうか? (「COUNT(*)>0」ならまだ分かりますが、この場合はEXITS述語を使ったほうがパフォーマンス的に有利な気がします。) この欄だけではSQL全般のセオリーは書ききれません。 http://books.shoeisha.co.jp/book/b104811.html を是非読んでください。

関連するQ&A

  • SQL文でWhere+orを使う理由

    ItemsテーブルからValueにAという値かBという値を持ってる人のNameを取得するSQL文について調べたのですが、以下のようになってました。 SELECT Name FROM Items WHERE Value IN ('A', 'B') これで動く結果については納得できたのですが、ORを使っても良いのではないでしょうか。以下のようなやり方は出来ないのかと思ったのですが SELECT Name FROM Items WHERE Value = 'A' or 'B' のように=(イコール)の後の値にorをつけるという書き方は見当たりませんでした。これで動かない場合、以下の方法なら動くはずだと思います。 SELECT Name FROM Items WHERE Value = 'A' or Value = 'B' おそらく結果はINを使った場合と同じだと思うのですが、これはどのようにして使い分けられているのでしょうか?文の短さで言えば値が複数の場合はINの方がはるかに短くなってスマートですが、単数でもINの方が短く済みそうな気がします。INの後のカッコ内に更にSQL文を書くことも出来ますし、Where+orの意義がよく分からなくなってきました。

  • SQL文について質問させて頂きます。

    いつもお世話になっております。いろいろSQL文の本を読んだのですがわからないので今回もよろしく お願い致します。 SELECT DISTINCT * FROM bukken WHERE (id IN (SELECT fid FROM fudou_kodawari WHERE kid IN (1,4))) というSQL文があるのですが、これだと1,4が1つでも含まれるリストが出てくるのですが1,4が完全に一致しないと出てこないようにするにはどのようにSQL文を変更すれば良いのでしょうか? 何卒よろしくお願い致します。

  • SQL '%@'とは?

    こんばんわ。 SQLの質問なのですが、 SELECT * FROM aテーブル WHERE aテーブル.番号 IN '%@' というSQL文が 学校で使われていましたが、 '%@'とは何を指すのでしょうか? 調べても分からなかったので ご教授願います。

  • ProCOBOL/SQLについて

    ProCOBOLの埋め込みSQLで ...WHERE A = 0 AND EXISTS (SELECT ...) っていうのがあるんですが、"EXISTS"ってどういう意味なんですか? それと"FOR UPDATE OF ..."の意味もわかりません。 教えてくださーい。お願いします。

  • SQLの速度をあげるには・・・

    テキストファイルからキーワードを拾って SQLをなげています SQLの質問になってしまうかもしれません いまはADO接続でやっています Open ファイル as input...... SQL = select * from tbl where name like '%キーワード%' execute(SQL) レコードセットの値で処理をいろいろ・・・ Loop もともとのDBの件数がものすごくおおくてselect文に結構な時間が かかってしまいます。速度をあげるほうほうってあるのでしょうか 私にはおもいつかなくて・・・ こういったほうほうは どう? ってのがありましたら おしえていただきたいのですが よろしくおねがいします。

  • SQLServer2000 SQL文について

    SQLServer2000 SQL文について Where句内で、このような演算指定はできますか? できない場合このようなSQLを実行したい場合 他にどのような方法が考えられますでしょうか? select a.id from a,b where a.yymm = b.yymm-1

  • EXSIST述語を使った副問合わせについて

    SELECT HINMOKU_NAME FROM HINMOKU WHERE HINMOKU_CODE IN (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE = '2004-11-10'); 上記をSQL文をEXISTS述語を使って書き換えると エラーが出てしまい、うまく書き換えがすることが できません。下記にエラーがでるSQL文を記載いたします。 SELECT HINMOKU_NAME FROM HINMOKU WHERE EXISTS (SELECT HINMOKU_CODE FROM URIAGE WHERE URIAGE_DATE ='2004-11-10' WHERE HINMOKU.HINMOKU_CODE=URIAGE.HINMOKU_CODE); 上記SQL文についてどこに問題があるのか、ご教授お願い致します。

  • SQLの質問

    3つわからないことがあります。 1.SQLのINとEXISTSって何が違うんですか? 本を見ると ・WHERE 項目 IN(select・・・) ・WHERE EXISTS(select・・・) INはWHEREとの間に何か入り、EXISTSは何も入ってないようですが・・。違いがわかりません。 2.そして、上の質問の続きですが、副問合せ文中で主問合せの表を参照する ことを相関問合せと、いうらしいのですが、解説を見ると、existsのときの み相関問合せは使える、ように書いてあります。しかし別の本ではINを使用 してるときでもこの相関問合せが使われていて・・・・・??何がなん だかわからなくなりました。 3.そしてまた別の本では、”相関副問合せ”というものがあり、相関問合せと同じ ものなのか、違うものなのかわかりません。ぱっと見た限りでは相関問合せと同じに見えるのですが・・・

  • SQL 繰り返し処理をSQLでかく方法

    質問させてください。 FOR文を使うことなしに、繰り返し処理をいくつかのSELECT文にわけて処理をするにはどのようにかけば良いのでしょうか。 標準SQLです。

  • SQL : たしかに DELETE したの?

    ありがちな処理かと思いまして質問させていただきます。 SQLで DELETE を行う際、WHERE で絞り込んだ対象行がなくても、  「エラーは返ってこない」 ということですが、NOT FOUND判定はするのでしょうか。 ごく単純に、削除しようとしたデータが実際にあったのかを確認したいのです。 やろうとしている処理は、次のようなものです。 DELETE FROM a_tbl WHERE NOT EXISTS (SELECT row1 FROM b_tbl WHERE row1 = 'input_data' ) AND NOT EXISTS (SELECT row1 FROM c_tbl WHERE row1 = 'input_data' ); ようするに、他のテーブルに、すでにない行であることが前提で、 a_tbl から DELETE したことを確認したいのです。 Pro*C内で実行するのですが、一般に同じだと思います。 キホンのキかもしれませんが、よろしくお教えください。