• ベストアンサー

【チューニング】インデックスとヒント句の違い

いつもお世話になっています。 oracle9iR2を使用しています。 速度アップのためチューニングが必要なsqlが指摘されたのですが、 あるカラムにインデックスを作成すべきとの指摘がありました。 インデックスを作成するだけである程度改善される場合もあるのでしょうか? それともインデックス作成後、対象のsql/に、*+INDEX・・・ などのようにSQLにヒント句を記載してこそ効果を発揮するものなのでしょうか? 質問がまとはずれでしたら申し訳ありません。 どなたかご教授お願いします。

  • Oracle
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

インデックスは作成すると使うという選択肢に入るようになりますが、必ず使われるというわけではありません。Analyzeの結果、インデックスを使うよりも全表走査を行った方がいいとOracleが判断した場合、インデックスは使われずに全表走査が行われることもあります。 ここで、どうしても特定のインデックスを使用させたかったり、結合方法や結合順序を決め打ちしたかったりする場合にヒントを使用します。 基本的にはOracleがあるアルゴリズムで最も高速に検索できる実行計画を立てるものですが、場合によっては思うような実行計画を立ててくれない場合があります。そういった場合にOracleにこの方法で検索した方が早いですよと教えてあげるのがヒントです。ただし、不適切なヒントを設定した場合、返って遅くなる場合も当然ながらあります。 従って、ヒントを設定するにはそれなりのパフォーマンスチューニングに関する知識が必要となるでしょう。

yukio200263
質問者

お礼

詳細で分かりやすい説明ありがとうございます。 とってもよく分かりました

その他の回答 (1)

  • kaeru_007
  • ベストアンサー率22% (8/36)
回答No.1

INDEXを作成するだけで、次回のSELECTの発行から自動的に使用されます。 もし、元々他に設定していた別のINDEXが使用されてしまうようであれば、ヒント句で使用したいINDEXを指定してあげるといいです。 Oracleの作成する実行計画を見ることで、どのINDEXが使用されるのか確認できます。 PLAN TABLEとか、auto trace などのキーワードで調べてみると色々出てくると思います。

yukio200263
質問者

お礼

なるほど。ありがとうございます。

関連するQ&A

  • ヒント句が無効になります

    こんばんは。 スクラッチで開発を行っているものです。 SQLのレスポンスが悪いので、テーブルにインデックスを追加し、 念のためにsqlにヒント句をつけよう と上司から提案され、SQLのヒント句が正常に読み込まれるか確認を行いました。 しかし、オブジェクトブラウザで動作が遅くなることが確認できた(通常:1秒未満、ヒント句:10秒以上)ヒント句を使用したsql文をプロパティファイルに設定してもレスポンスはヒント句をつける前とつけた後で変わりませんでした。 オブジェクトブラウザで動作が遅くなっていることが確認済ですので、 ヒント句が正しくないためにヒント句が無効になっている と言うわけではありません。 スクラッチでは、ヒント句がコメントとみなされるため、ヒント句自体が意味ないのか、使用しているヒント句がスクラッチで推奨されていない(使用しているヒント区は「FULL(テーブル名)」です。)または、それ以外の理由なのか皆目見当がつきません。 もし、スクラッチでもヒント句を有効にする方法があれば教えていただきたいです。 どなたか、スクラッチにおけるSQL文について詳しい方いらっしゃいましたらお教えください。

  • IN 句ではインデックスが使用されない?

    環境はDB2で現在チューニング作業を担当しています。 ここでWHEREに COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが インデックスが使われません。 ※テーブルスキャンになります 上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。 でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると インデックスを使います。うーんという感じです。 お手数ですがご意見お願いします。。

  • インデックスを張るべき項目について

    20万件レコードのあるテーブルに、インデックスを張ると INSERTが遅くなるので、WHERE句で検索する項目のどれに インデックスを張るか悩んでいます。 インデックスはパターンが多い程、張った場合に 検索速度が向上すると理解しているのですが正しいでしょうか? であれば、下記1.だけは貼ろうと思っているのですが・・ 1.カラムに入るデータが殆どバラバラのVARCHAR(30) 2.カラムに入るデータは10万パターンのINT型 3.カラムに入るデータは1万パターンのINT型 4.カラムに入るデータはdatetime型 インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • チューニングのこつ

    大雑把すぎるかもしれませんが、 アプリケーションチューニング パラメータチューニング SQLチューニング のポイントみたいなのがあれば、教えてください。 よろしくです。 それと、 作成したオブジェクトのシンプルな確認方法も知っておきたいと思います。 オブジェクト作成時に、エラーメッセージが返ってこなかったので「それでよし」ということではなく、 例えば、シノニムを作成したら、スキーマ指定なしで見れるとか、 シーケンスを作成したら、..... パッケージを作成したら、..... インデックスを作成したら、など、種類に応じて、妥当な確認方法があると思います。

  • Oracleチューニング

    Oracle9i(9.0.2)を利用しています。 現在パフォーマンス低下のため、抽出効率の悪いSQLを探していますが、どのSQLが効率が悪いのか分かりません。 本番環境なのでSTATSPACKを利用することもままならず、どうにかV$ビューを利用して解決したいです。 どなたかご存知でしたらどの項目がどの項目より大きければチューニング対象のSQL などと言う指標をご教授願えませんでしょうか? 私としてはV$SQLがどうも使えそうかと考えておりますが、カンであって実際にどの項目を利用すれば良いのか見当がついていないレベルです。 よろしくお願いいたします。

  • Selectの処理速度改善について

    先日、PL/SQLの開発について、こんな質問を受けました。 「SQLを組むさい、処理速度を速めるためにやっていることは?」 と。 で、ちょっと考えて 「Selectなら、Indexを考慮してSelect文を作成し、実行します。 処理時間がかかる場合は、実行計画などをみて、 Select文にヒント句をつけて、処理速度を改善します。」 と答えました。 答えたあと、質問者された方は、なんだかがっかりした感じでしたが、 私の回答は不適切だったのでしょうか? それとも、どういう回答が良かったのでしょうか? よろしくお願いします。

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • INDEX RANGE SCAN とは?

    OracleのINDEX RANGE SCANについての質問です。 私の理解のレベルでは、INDEX RANGE SCANは範囲検索をする時に発生し、 それ自体は効率的にインデックスを利用している状態である、と理解しています。 もっといえば、betweenを使用したり演算子に「>=」などの不等号を使用した とき以外には発生しないはずと思っていました。 しかし先日、条件部分に「=」等号しかないSQLにてINDEX RANGE SCANが発生しました。 INDEX SKIP SCAN ならまだ話はわかるのですが、間違いなくINDEX RANGE SCANでした。 範囲検索で無い場合にINDEX RANGE SCANになる意味がよくわかりません。 ■以下質問です。 範囲検索の場合にINDEX RANGE SCANになるという私の認識はあっているか。 どのような場合に、等価条件だけの場合にINDEX RANGE SCANになるのか。 等価条件だけなのにINDEX RANGE SCANになる場合、検索の仕組みについて。 ■参考情報として記述しておきます。 バージョンは9iです。 1つのテーブルに対するSELECT文で where句には4つのカラムが等価条件で指定されています。 これらのカラムは条件・カラムの値ともにNULLではありません。 関係あるかわかりませんが、カーディナリティが高いにもかかわらず 適切なインデックスが無いSQLでした。 よろしくお願いします。

  • 複合インデックスの設定に関して

    MySQLの複合インデックスに関して質問させて頂きます。 現在検索条件に3つのカラムを使用して検索をかけているSELECT文があります。 データの件数は100万件ほどあるとします。 【例】 「SELECT * FROM test WHERE a = '1' AND b = 'xxxxx' AND c = '1';」 カラム「a」「c」は、0と1のみが格納されたカラムで、頻繁に更新されます。 カラム「b」は、同じ値が入ることがありますが、ほぼユニークな文字列が格納されます。 上記のような場合、インデックスは ・「a,b,c」の全てを設定した複合インデックスを作成するべきか。 ・cは頻繁に更新されるので、「a,b」のみの複合インデックスを作成するべきか。 ・aも同じく頻繁に更新されるので、WHERE句の検索順をbを先に持ってきて、「b」のみの単独インデックスを作成するべきか。 一概にこうだという答えは無いかもしれませんが、何か良い方法があれば教えて頂けると幸いです。 また、質問に不備な点がございましたら、ご指摘お願いいたします。

    • ベストアンサー
    • MySQL
  • オラクルのhint語について

    オラクルのview文に二つテーブルが存在します。 このようなhint語がどのように書いていますか。 例えば: view句  名前:vAB 「select A.a,B.b from A,B where *******;」 注; テーブルAのインデックス「name」, テーブルBのインデックス「age」。 有識者ご教えていただけませんか。