次の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 …
Oracleオプティマザはルールベースでした。
上記SQLを実行し、おっしゃる通り■即■のSQLと同じ実行計画になります。おかけさまで問題は解決できました。
基本的なところから記述して頂いてかつわかりやすい説明は大変参考になりました。
ありがとうございました。
No.2
- 回答日時:
こんにちは。
それぞれのSQLを実行した際の実行計画(Execution Plan)は、確認済でしょうか?
⇒SQL*Plusをお使いで、AUTOTRACE機能が使用可能な環境であれば、
SQL> set autotrace on の後、
SQL*Plus上でSQLを直接実行することで、実行計画が取得できます。
実行計画を見れば、それぞれのSQLを実行した際の違いが
明らかになると思いますよ。
実行計画の方法がわからなくてやってませんでした。
ありがとうございます。
結局は違うインデックスが使われていました。。
インデックス1(「NO_UKE」「CD_STS」)を見ずに
インデックス2(「CD_STS」)を見てました。
なぜインデックス1が使われていないのでしょうか?
検索条件で「NO_UKE」「CD_STS」が使われているなら当然にインデックス1が使われると思っているのですが。。
しかしとりあえず一歩進むことができました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
SQL ORDER BYにおける条件について
-
アナライズでほとんどの処理が...
-
WHERE句の実行順序
-
Access VBAで行ラベルが定義さ...
-
重複するIDのデータを1行にま...
-
Accessのマクロでモジュールを...
-
ストアド実行時のエラー「参照...
-
VBA プロシージャの名前の取得
-
Oracle 10g 他スキーマの参照権...
-
PL/SQLでSPOOLさせたいのですが...
-
SQL*Loaderでのsysdate使用
-
sqlplusのspoolで空白行出現
-
VB.NET Type.GetFieldsメソッド...
-
Excel:ThisWorkbookオブジェク...
-
ExcelのSUMPRODUCTで日付の範囲...
-
Oracle 10gで順序sequenceの作...
-
sqlplusでヘッダーが付かない
-
OutlookVBAで作成したマクロに...
-
Statement ignored というエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
likeとsubstrの使いわけについて
-
問題解決のストーリーにて PDCA...
-
ヒント句が無効になります
-
実行計画HASH JOIN RIGHT OUTER
-
SQL ORDER BYにおける条件について
-
アナライズでほとんどの処理が...
-
Like文の速度について教えてく...
-
あいまい検索のパフォーマンス...
-
ORACLEでwhere句の検索順序
-
JOINの時のONとWHEREの違いにつ...
-
oracleのanalyzeと処理時間につ...
-
WHERE句はJOIN結合前結合後どち...
-
【チューニング】インデックス...
-
計画段階での怠惰
-
PDCAを回すって?
-
外部結合と等価結合のパフォー...
-
DATE型カラムのインデックスが...
-
Analyzeとは?
おすすめ情報