- ベストアンサー
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
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 #3 のmuyoshid です。 > 「オプティマイザを使用しているのであれば」 > ということは、必ずオプティマイザが使われるわけでは > ないのでしょうか。 Oracle9i の場合、コストベース・オプティマイザと ルールベース・オプティマイザの2種類のオプティマイザ が実装されています。 簡単に説明すると、 ルールベース・オプティマイザ: 検索に使用する索引の優先順位や、結合方法に優先順位 が決められていて、優先順位の高いものから選択される ようになっています。 コストベース・オプティマイザ: テーブルをAnalyze して収集した統計情報に基いて アクセスパスが決定されます。 Materialized View やFunction 索引等、 コストベース・オプティマイザの使用が前提となっている 機能もいくつかあります。 ユーザ登録 (無料) が必要ですが、OTN Japan でPDF 形式の マニュアルを公開していますので、詳細はこちらで確認 されてみてはいかがでしょうか? 「Oracle9i パフォーマンスチューニング・ガイドおよびリファレンス」 に詳しく記載されています。
- 参考URL:
- http://otn.oracle.co.jp/
その他の回答 (5)
- kakusuke
- ベストアンサー率36% (95/259)
>インデックスを貼ってなかった場合 >(idのみ)はどうなるのでしょうか。 もちろんオプティマイザに依存するのですが、 依存しても インデックス以外の項目 が存在するだけで、 コストが5倍かかるといっても 過言ではありません。 8i以降その傾向が顕著になってきました。 5万件のデータリードだけで、 30分かかってしまうこともあります。 特にODBCなどを介して、 RDO,ADOを利用する場合は 注意が必要です。
お礼
お礼が遅くなり申し訳ございませんでした。 大変参考になりました。
- jmh
- ベストアンサー率23% (71/304)
場合によっては、 where my_slow_funxion(name) = 1 and name = 'a' の方が where name = 'a' and my_slow_funxion(name) = 1 よりも 速かったような気がします(逆?)。 もし、試してみていただけるのなら、結果を教えていただけると嬉しいです。
お礼
お礼が遅くなり申し訳ございませんでした。 大変参考になりました。
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 ルールベース・オプティマイザを使用しているのであれば通常の索引を使用した検索 よりも主キーによる検索の方が優先度が高いので、主キーが使われます。 と言う事で、どちらのSQL 文でもパフォーマンスは同じはずです。
お礼
ご回答有難うございます。 「オプティマイザを使用しているのであれば」 ということは、必ずオプティマイザが使われるわけではないのでしょうか。 索引よりも主キーの優先度が高いのですね。 #2の方と逆の説になってしまい、ますます悩んでしまいます・・。 主キー優先となった場合に、where句での書き順はどちらでも同じ、というのはどうしてなんでしょう? 先に書いたほうが早い、とか後に書いたほうが早い、とかいう概念自体が間違っているのでしょうか。 もしよろしければひきつづきご回答いただけないでしょうか。
- kakusuke
- ベストアンサー率36% (95/259)
select /*+ index(table_a インデックス名) */ text from table_a where id = 1 and sort = 2 and name = 'a' とすれば Where句をどう変えようと 指定されたインデックスを 一番最初に見るので パフォーマンスが一番いいです。
お礼
ご回答有難うございます。 インデックスを貼ってある場合はインデックス優先なんですね。 ではインデックスを貼ってなかった場合 (idのみ)はどうなるのでしょうか。 もしよろしかったら引き続きご回答いただけないでしょうか。
- mi-si
- ベストアンサー率35% (200/567)
Oracleはオプティマイザが働いて、最適な実行順序に組み替えてしまうので、実際にどのような順序で実行されているかは解りません。 EXPLAIN PLANで実際の実行順序を調べてみたらどうでしょうか?
お礼
ご回答有難うございます。 実際の順序で実行されるかはわからないのですね。 EXPLAIN PLANというのも明日さっそくやってみます。
お礼
お礼が遅くなり申し訳ございませんでした。 大変参考になりました。