
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
No.5ベストアンサー
- 回答日時:
こんにちわ。
#3 のmuyoshid です。
> 「オプティマイザを使用しているのであれば」
> ということは、必ずオプティマイザが使われるわけでは
> ないのでしょうか。
Oracle9i の場合、コストベース・オプティマイザと
ルールベース・オプティマイザの2種類のオプティマイザ
が実装されています。
簡単に説明すると、
ルールベース・オプティマイザ:
検索に使用する索引の優先順位や、結合方法に優先順位
が決められていて、優先順位の高いものから選択される
ようになっています。
コストベース・オプティマイザ:
テーブルをAnalyze して収集した統計情報に基いて
アクセスパスが決定されます。
Materialized View やFunction 索引等、
コストベース・オプティマイザの使用が前提となっている
機能もいくつかあります。
ユーザ登録 (無料) が必要ですが、OTN Japan でPDF 形式の
マニュアルを公開していますので、詳細はこちらで確認
されてみてはいかがでしょうか?
「Oracle9i パフォーマンスチューニング・ガイドおよびリファレンス」
に詳しく記載されています。
参考URL:http://otn.oracle.co.jp/
No.4
- 回答日時:
場合によっては、
where my_slow_funxion(name) = 1 and name = 'a'
の方が
where name = 'a' and my_slow_funxion(name) = 1
よりも
速かったような気がします(逆?)。
もし、試してみていただけるのなら、結果を教えていただけると嬉しいです。
No.3
- 回答日時:
こんにちわ。
ルールベース・オプティマイザを使用しているのであれば通常の索引を使用した検索
よりも主キーによる検索の方が優先度が高いので、主キーが使われます。
と言う事で、どちらのSQL 文でもパフォーマンスは同じはずです。
ご回答有難うございます。
「オプティマイザを使用しているのであれば」
ということは、必ずオプティマイザが使われるわけではないのでしょうか。
索引よりも主キーの優先度が高いのですね。
#2の方と逆の説になってしまい、ますます悩んでしまいます・・。
主キー優先となった場合に、where句での書き順はどちらでも同じ、というのはどうしてなんでしょう?
先に書いたほうが早い、とか後に書いたほうが早い、とかいう概念自体が間違っているのでしょうか。
もしよろしければひきつづきご回答いただけないでしょうか。
No.2
- 回答日時:
select
/*+ index(table_a インデックス名) */
text
from table_a
where id = 1
and sort = 2
and name = 'a'
とすれば
Where句をどう変えようと
指定されたインデックスを
一番最初に見るので
パフォーマンスが一番いいです。
ご回答有難うございます。
インデックスを貼ってある場合はインデックス優先なんですね。
ではインデックスを貼ってなかった場合
(idのみ)はどうなるのでしょうか。
もしよろしかったら引き続きご回答いただけないでしょうか。
No.1
- 回答日時:
Oracleはオプティマイザが働いて、最適な実行順序に組み替えてしまうので、実際にどのような順序で実行されているかは解りません。
EXPLAIN PLANで実際の実行順序を調べてみたらどうでしょうか?
参考URL:http://oracledba.at.infoseek.co.jp/dba/contents/ …
ご回答有難うございます。
実際の順序で実行されるかはわからないのですね。
EXPLAIN PLANというのも明日さっそくやってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
likeとsubstrの使いわけについて
-
WHERE句の実行順序
-
PL SQL のループ
-
oracleのanalyzeと処理時間につ...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
【Excel VBA】 WorksheetやRa...
-
Accessの数値から時間に変換す...
-
重複するIDのデータを1行にま...
-
Access VBAで行ラベルが定義さ...
-
23時59分59秒までのデータを抽...
-
アクセスのクエリ フィールド...
-
質問:DBMS_OUTPUTの使用方法
-
SQLで部分的にGROUP BYしたいとき
-
sqlplusのspoolで空白行出現
-
DB2のTimestamp型
-
VB.NET Type.GetFieldsメソッド...
-
14桁の日付(YYYYMMDDHHMMSS)を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
likeとsubstrの使いわけについて
-
SQL ORDER BYにおける条件について
-
WHERE句はJOIN結合前結合後どち...
-
あいまい検索のパフォーマンス...
-
ヒント句が無効になります
-
【チューニング】インデックス...
-
アナライズでほとんどの処理が...
-
Like文の速度について教えてく...
-
いつもお世話になってます。
-
実行計画(EXPLAIN PLAN、AUTOT...
-
Oracleで検索すると、フリーズ...
-
TeXの索引作成に関して
-
DATE型カラムのインデックスが...
-
Selectの処理速度改善について
-
実行計画HASH JOIN RIGHT OUTER
-
データ抽出の速度について
-
JOINの時のONとWHEREの違いにつ...
-
Analyzeとは?
おすすめ情報