こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2004-02-25 23:41:27

QNo.789968

すぐに回答ほしいです

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

こんにちわ。
#3 のmuyoshid です。

> 「オプティマイザを使用しているのであれば」
> ということは、必ずオプティマイザが使われるわけでは
> ないのでしょうか。
Oracle9i の場合、コストベース・オプティマイザと
ルールベース・オプティマイザの2種類のオプティマイザ
が実装されています。
簡単に説明すると、
ルールベース・オプティマイザ:
 検索に使用する索引の優先順位や、結合方法に優先順位
 が決められていて、優先順位の高いものから選択される
 ようになっています。
コストベース・オプティマイザ:
 テーブルをAnalyze して収集した統計情報に基いて
 アクセスパスが決定されます。
 Materialized View やFunction 索引等、
 コストベース・オプティマイザの使用が前提となっている
 機能もいくつかあります。

ユーザ登録 (無料) が必要ですが、OTN Japan でPDF 形式の
マニュアルを公開していますので、詳細はこちらで確認
されてみてはいかがでしょうか?
「Oracle9i パフォーマンスチューニング・ガイドおよびリファレンス」
に詳しく記載されています。

参考URL:http://otn.oracle.co.jp/

投稿日時 - 2004-02-26 23:08:58

お礼

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

投稿日時 - 2004-04-27 20:59:34

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>インデックスを貼ってなかった場合
>(idのみ)はどうなるのでしょうか。

もちろんオプティマイザに依存するのですが、
依存しても
インデックス以外の項目
が存在するだけで、
コストが5倍かかるといっても
過言ではありません。
8i以降その傾向が顕著になってきました。
5万件のデータリードだけで、
30分かかってしまうこともあります。

特にODBCなどを介して、
RDO,ADOを利用する場合は
注意が必要です。

投稿日時 - 2004-02-26 23:18:56

お礼

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

投稿日時 - 2004-04-27 21:00:07

ANo.4

jmh

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

投稿日時 - 2004-02-26 22:47:19

お礼

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

投稿日時 - 2004-04-27 20:59:07

ANo.3

こんにちわ。

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

投稿日時 - 2004-02-26 14:21:25

お礼

ご回答有難うございます。
「オプティマイザを使用しているのであれば」
ということは、必ずオプティマイザが使われるわけではないのでしょうか。

索引よりも主キーの優先度が高いのですね。
#2の方と逆の説になってしまい、ますます悩んでしまいます・・。

主キー優先となった場合に、where句での書き順はどちらでも同じ、というのはどうしてなんでしょう?
先に書いたほうが早い、とか後に書いたほうが早い、とかいう概念自体が間違っているのでしょうか。

もしよろしければひきつづきご回答いただけないでしょうか。

投稿日時 - 2004-02-26 20:33:44

ANo.2

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

投稿日時 - 2004-02-26 09:16:33

お礼

ご回答有難うございます。
インデックスを貼ってある場合はインデックス優先なんですね。

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

投稿日時 - 2004-02-26 20:30:14

ANo.1

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

EXPLAIN PLANで実際の実行順序を調べてみたらどうでしょうか?

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

投稿日時 - 2004-02-25 23:57:41

お礼

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

投稿日時 - 2004-02-26 20:24:27

あなたにオススメの質問