アプリ版:「スタンプのみでお礼する」機能のリリースについて

次の2つのSQLで10秒前後の開きがあります。
原因は「CD_STS」なのですが、理由がわかりません。
データは700万件あります。
インデックスは「NO_UKE」と「CD_STS」につけています。インデックスは全部で5つあります。
なぜこれほど違いがでるのでしょうか?
原因がわかったのでお客さんに説明したいのですが理由がわからなくて困っています。。
考えられそうな理由があればお願いいたします。

■即■
select CD_STS from
T_STS
where CD_KAIIN = 50
and FL_DEL = 0
and NO_UKE = 10
and (CD_STS <= 7 and CD_STS >= 7)

■10秒前後かかる■
select CD_STS from
T_STS
where CD_KAIIN = 50
and FL_DEL = 0
and NO_UKE = 10
and CD_STS = 7

A 回答 (3件)

#2です。


Oracleオプティマイザはルールベースでしょうか?

 ⇒以下のSQLを実行して、 num_rows ~ blocks 列の値が NULL でなければコストベース、
  NULL ならばルールベースです。

   select table_name, num_rows, avg_row_len, blocks
   from user_tables
   where table_name = 'T_STS';


・ルールベースである
・インデックス2(「NO_UKE」)が、インデックス1(「NO_UKE」+「CD_STS」)よりも
 後に作成された
という前提でアドバイスをさせていただきますと…
Oracleオプティマイザは、後に作成されたインデックスを優先して
Rangeスキャンを試みようとする傾向があるようです。
ですから、抽出時に使用するインデックスを明示しないと
後に作成されたインデックス2(「NO_UKE」)が選択使用されます。
抽出の条件が複数ある場合、複数項目で構成されるインデックスを使用した方が
パフォーマンスが良くなりますので、インデックス1(「NO_UKE」+「CD_STS」)を抽出時に
使用されるよう、オプティマイザに『ヒント』を与えてやれば解決します。

以下のSQLを実行すると、おそらく ■即■ のSQLと同じ実行計画になると思われます。

select /*+ INDEX(T_STS インデックス1の名前) */ CD_STS
from T_STS
where CD_KAIIN = 50
and FL_DEL = 0
and NO_UKE = 10
and CD_STS = 7;


【まとめ】
 ルールベースオプティマイザモードにおいて、複数のインデックスが存在する
 テーブルに対して抽出を行う場合、抽出条件によっては単一項目のインデックスよりも
 複数項目のインデックスを優先して使用させるよう、明示的に指定することで
 パフォーマンスが改善する可能性があります。

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
    • good
    • 0
この回答へのお礼

Oracleオプティマザはルールベースでした。
上記SQLを実行し、おっしゃる通り■即■のSQLと同じ実行計画になります。おかけさまで問題は解決できました。
基本的なところから記述して頂いてかつわかりやすい説明は大変参考になりました。
ありがとうございました。

お礼日時:2005/03/31 20:21

こんにちは。


それぞれのSQLを実行した際の実行計画(Execution Plan)は、確認済でしょうか?

 ⇒SQL*Plusをお使いで、AUTOTRACE機能が使用可能な環境であれば、
   SQL> set autotrace on の後、
  SQL*Plus上でSQLを直接実行することで、実行計画が取得できます。

実行計画を見れば、それぞれのSQLを実行した際の違いが
明らかになると思いますよ。
    • good
    • 0
この回答へのお礼

実行計画の方法がわからなくてやってませんでした。
ありがとうございます。
結局は違うインデックスが使われていました。。
インデックス1(「NO_UKE」「CD_STS」)を見ずに
インデックス2(「CD_STS」)を見てました。
なぜインデックス1が使われていないのでしょうか?
検索条件で「NO_UKE」「CD_STS」が使われているなら当然にインデックス1が使われると思っているのですが。。
しかしとりあえず一歩進むことができました。
ありがとうございました。

お礼日時:2005/03/30 21:22

回答ではないのですが。



インデックスを貼ってあるものをwhereの頭に持ってきたほうが、パフォーマンスが良いって聞いたことがあります。

今回の件には当てはまりませんが。

すいません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
インデックスはつけてるんですが、目的のインデックスが使用されてなかったみたいでした。

お礼日時:2005/03/31 01:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す