• ベストアンサー

ORACLEでwhere句の検索順序

Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.5

こんにちわ。 #3 のmuyoshid です。 > 「オプティマイザを使用しているのであれば」 > ということは、必ずオプティマイザが使われるわけでは > ないのでしょうか。 Oracle9i の場合、コストベース・オプティマイザと ルールベース・オプティマイザの2種類のオプティマイザ が実装されています。 簡単に説明すると、 ルールベース・オプティマイザ:  検索に使用する索引の優先順位や、結合方法に優先順位  が決められていて、優先順位の高いものから選択される  ようになっています。 コストベース・オプティマイザ:  テーブルをAnalyze して収集した統計情報に基いて  アクセスパスが決定されます。  Materialized View やFunction 索引等、  コストベース・オプティマイザの使用が前提となっている  機能もいくつかあります。 ユーザ登録 (無料) が必要ですが、OTN Japan でPDF 形式の マニュアルを公開していますので、詳細はこちらで確認 されてみてはいかがでしょうか? 「Oracle9i パフォーマンスチューニング・ガイドおよびリファレンス」 に詳しく記載されています。

参考URL:
http://otn.oracle.co.jp/
sunnys
質問者

お礼

お礼が遅くなり申し訳ございませんでした。 大変参考になりました。

その他の回答 (5)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.6

>インデックスを貼ってなかった場合 >(idのみ)はどうなるのでしょうか。 もちろんオプティマイザに依存するのですが、 依存しても インデックス以外の項目 が存在するだけで、 コストが5倍かかるといっても 過言ではありません。 8i以降その傾向が顕著になってきました。 5万件のデータリードだけで、 30分かかってしまうこともあります。 特にODBCなどを介して、 RDO,ADOを利用する場合は 注意が必要です。

sunnys
質問者

お礼

お礼が遅くなり申し訳ございませんでした。 大変参考になりました。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.4

場合によっては、  where my_slow_funxion(name) = 1 and name = 'a' の方が  where name = 'a' and my_slow_funxion(name) = 1 よりも 速かったような気がします(逆?)。 もし、試してみていただけるのなら、結果を教えていただけると嬉しいです。

sunnys
質問者

お礼

お礼が遅くなり申し訳ございませんでした。 大変参考になりました。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

こんにちわ。 ルールベース・オプティマイザを使用しているのであれば通常の索引を使用した検索 よりも主キーによる検索の方が優先度が高いので、主キーが使われます。 と言う事で、どちらのSQL 文でもパフォーマンスは同じはずです。

sunnys
質問者

お礼

ご回答有難うございます。 「オプティマイザを使用しているのであれば」 ということは、必ずオプティマイザが使われるわけではないのでしょうか。 索引よりも主キーの優先度が高いのですね。 #2の方と逆の説になってしまい、ますます悩んでしまいます・・。 主キー優先となった場合に、where句での書き順はどちらでも同じ、というのはどうしてなんでしょう? 先に書いたほうが早い、とか後に書いたほうが早い、とかいう概念自体が間違っているのでしょうか。 もしよろしければひきつづきご回答いただけないでしょうか。

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

select /*+ index(table_a インデックス名) */ text from table_a where id = 1 and sort = 2 and name = 'a' とすれば Where句をどう変えようと 指定されたインデックスを 一番最初に見るので パフォーマンスが一番いいです。

sunnys
質問者

お礼

ご回答有難うございます。 インデックスを貼ってある場合はインデックス優先なんですね。 ではインデックスを貼ってなかった場合 (idのみ)はどうなるのでしょうか。 もしよろしかったら引き続きご回答いただけないでしょうか。

  • mi-si
  • ベストアンサー率35% (200/567)
回答No.1

Oracleはオプティマイザが働いて、最適な実行順序に組み替えてしまうので、実際にどのような順序で実行されているかは解りません。 EXPLAIN PLANで実際の実行順序を調べてみたらどうでしょうか?

参考URL:
http://oracledba.at.infoseek.co.jp/dba/contents/explainplan.htm
sunnys
質問者

お礼

ご回答有難うございます。 実際の順序で実行されるかはわからないのですね。 EXPLAIN PLANというのも明日さっそくやってみます。