次の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で質問しましょう!
似たような質問が見つかりました
- ロック・パンク・メタル ハードロックバンドのPOIZONに関して教えて下さい。 2 2022/04/25 15:49
- 英語 商品に印刷する言葉の英訳 7 2022/10/20 10:46
- 英語 提示文で複合関係代名詞を繰り返さない理由の有無について 7 2022/11/21 12:32
- その他(パソコン・スマホ・電化製品) 条件を満たすwindowsXP パソコンをお探しいただけますか。 3 2022/09/11 10:47
- デジタルカメラ 撮った写真がCD-Rに記録されていません 2 2022/09/12 00:31
- ドライブ・ストレージ 外付けCDドライブだけ音楽CDが読み込まない 3 2023/08/18 21:28
- USBメモリー・SDカード・フラッシュメモリー オリジナルのデータを預けたくないです 3 2022/09/12 01:51
- 一眼レフカメラ 写真屋でCD化してもらったCDも劣化するのですか 1 2022/09/09 00:05
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- 邦楽 中島みゆきさんの「最後の女神」って曲について 1 2023/04/05 10:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
likeとsubstrの使いわけについて
-
あいまい検索のパフォーマンス...
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
実行計画HASH JOIN RIGHT OUTER
-
Oracle8,9で取得したデータを結...
-
PDCAを回すって?
-
Oracleで検索すると、フリーズ...
-
SQL ORDER BYにおける条件について
-
Like文の速度について教えてく...
-
ヒント句が無効になります
-
アナライズでほとんどの処理が...
-
Accessのマクロでモジュールを...
-
sqlplusでヘッダーが付かない
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
SQLサーバで和暦から西暦に変換...
-
今日の日付が入った行のデータ...
-
PL/SQLカーソルの2重FORループ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
キャッシュを使わずにSELECTを...
-
likeとsubstrの使いわけについて
-
WHERE句の実行順序
-
Like文の速度について教えてく...
-
WHERE句はJOIN結合前結合後どち...
-
ヒント句が無効になります
-
JOINの時のONとWHEREの違いにつ...
-
あいまい検索のパフォーマンス...
-
アナライズでほとんどの処理が...
-
SQL ORDER BYにおける条件について
-
800万件のテーブル読み込み...
-
問題解決のストーリーにて PDCA...
-
実行計画HASH JOIN RIGHT OUTER
-
oracleのanalyzeと処理時間につ...
-
PDCAを回すって?
-
【チューニング】インデックス...
-
Oracleで検索すると、フリーズ...
-
Oracle 実行計画、統計情報の見方
-
OEMで負荷の少ないSQLの実行計...
-
データ抽出の速度について
おすすめ情報