• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLの処理速度改善にむけて)

SQL処理速度改善のための質問

このQ&Aのポイント
  • SQLの処理速度改善に向けて、3つの質問があります。検索条件の絞り込み方法、文字列の比較、TO_CHARの遅さについて教えてください。
  • 検索条件が複数ある場合、絞り込みが早い条件から検索するのが良いのか?文字列の検索において、X <> 'Z'とX > 'Z' and X < 'Z'は同じ結果か?TO_CHARが条件式に入ると遅くなるのか?
  • 3つの質問について回答してください。

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

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

> 1.検索条件が複数ある場合、もっとも絞れる物から検索するのが早いのでしょうか? 記述の順序には関係ありません。どれか一項目に絞るなら「X」に索引を貼るのが有効です。 > 2.文字列で検索する場合、以下は同じ結果でしょうか。そしてパターン2の方が早いでしょうか そもそも「X <> 'Z'」と「X > 'Z' and X < 'Z'」は同一条件ではありません。後者は常にFALSEです。 > 3.条件式にTO_CHARが入った場合、indexカラムの場合、遅くなるでしょうか? 一般的に関数を用いた項目については索引を使用しません。 しかし、 SELECT * from X,Y where TO_CHAR(X.DATE,'YYYYMM') = Y.DATE2(+) とは SELECT * FROM X LEFT JOIN Y ON TO_CHAR(X.DATE,'YYYYMM') = Y.DATE2 の意味ですから、X側のレコードは索引の有無に限らず全件アクセスされます。 逆にYのDATE2に索引があれば高速化できる余地があります。

evaan
質問者

補足

2は 「where X > 'Z' or X < 'Z'」 の事です。 ご解答ありがとうございました。 他の皆様もご解答、ありがとうございました。

その他の回答 (2)

  • entree
  • ベストアンサー率55% (405/735)
回答No.3

1. (X, Y, Z) で複合索引を張るのであれば、(X, Y, Z) でも、(Z, Y, X) でも変わらないでしょう。 単一列の索引の場合は X を使用するのが最も効率が良いです。 ヒント句を指定しても良いですが、統計情報をちゃんと取得しておけば、 X, Y, Z の各列に索引が張られていても X が使用されるはずです。 2. 以下の2つは同じです。 ・パターン1   where X <> 'Z' ・パターン2   where X > 'Z' or X < 'Z' 3. 書きなおす必要はありません。 Xの結果セット(レコード数)がYと比べて小さい場合は、 Y.DATE2列に索引がない場合は張ることを検討してください。 外部結合でNL結合される場合は、(+)が付いていない方が駆動表、 付いている方が内部表になります。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

1. where X = 3 and Y = 4 and Z = 5  も where Z = 5 and Y = 4 and X = 3 も同じはずです。 (データベースの内部的なことなのではっきりとはいいませんが、内部的には同じ処理をしていないと  SQLを解析して実際の処理をするところがおかしいとしか思えない。  ・・・Oracle6とか7.0とか古過ぎるversionは?なところもありますが。)  一方、インデックスの作り方では、上のどちらのwhere句でも Z,Y,Xでインデックスを作るより、 X,Y,Zでインデックスを作ったほうが早いはず。 (但し、コストベースの場合はちゃんと統計情報を取っていないと、X = 3 (1000件中10件に絞れる)というのを正しく認識できないこともあります・・・きちんと統計情報を取っていれば問題ないということですが。) 2. ・パターン2   where X > 'Z' and X < 'Z' は   where X > 'Z' or X < 'Z' なら同じでしょう。処理速度もたぶん一緒。 3. 条件式にTO_CHARが入った場合、indexカラムの場合、遅くなるでしょうか? ⇒インデックスを使わなくなります。 TO_CHARが入ったfunctionインデックスを作っておけば、それを使うので、早く処理してくれますが。 SELECT * from X,Y where TO_CHAR(X.DATE,'YYYYMM') = Y.DATE2(+) については、ANo1の方が書いておられるように、Xはインデックスを使っていないので 関数を含んでいようがいまいが、一緒。

関連するQ&A