• ベストアンサー

パフォーマンスについて

次の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

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

  • ベストアンサー
回答No.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/sq_tn03.htm
toshi_200578
質問者

お礼

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

その他の回答 (2)

回答No.2

こんにちは。 それぞれのSQLを実行した際の実行計画(Execution Plan)は、確認済でしょうか?  ⇒SQL*Plusをお使いで、AUTOTRACE機能が使用可能な環境であれば、    SQL> set autotrace on の後、   SQL*Plus上でSQLを直接実行することで、実行計画が取得できます。 実行計画を見れば、それぞれのSQLを実行した際の違いが 明らかになると思いますよ。

toshi_200578
質問者

お礼

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

  • iiikkk
  • ベストアンサー率37% (92/247)
回答No.1

回答ではないのですが。 インデックスを貼ってあるものをwhereの頭に持ってきたほうが、パフォーマンスが良いって聞いたことがあります。 今回の件には当てはまりませんが。 すいません。

toshi_200578
質問者

お礼

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

関連するQ&A