- ベストアンサー
oracle10gバージョンアップ後のSQLトラブル
- oracle10gにバージョンアップを行った後、数千万件のデータにバインド変数でアクセスするSQLがインデックスを使用せずにフルアクセスしてしまうトラブルが発生しました。
- この事象はCBOのデメリットと考えられます。
- ヒント句を使用してもINDEX FULL SCANとなり、むしろ遅くなってしまいます。明示的にINDEX RANGE SCANを適用させる方法はあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> おそらくバインドピークのデメリットが顕著にでてしまった 値の偏った列ということですね。 > 表名+インデックス名を書いてました /*+ index(table_name index_name) */ですね。 以下はマニュアルの抜粋ですが 別名の件はご存知でしたか? -------------------------------------------------- アクセスする表は、文に指定する場合と同じように正確 に指定してください。文が表の別名を使用している場合、 表の名前ではなく、表の別名をヒントで使用する必要が あります。スキーマ名が文中にある場合は、ヒント内の 表名にそのスキーマ名を入れないでください。 -------------------------------------------------- http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/hintsref.htm SQL、ヒント、統計情報の取得に問題がないのであれば、 INDEX RANGE SCANよりINDEX FULL SCANがコストが低いと オプティマイザが判断したということでしょうね。 # バインド変数をやめてリテラルで指定するとか…… > タイトルをつけないで投稿してしまい タイトルとつけないとこうなるんですか。 (知らなかった……) 勉強になります(笑)。 # 現場にいれば、あれこれとできるんですけどね。 # もどかしいものですね(笑)。
その他の回答 (2)
- entree
- ベストアンサー率55% (405/735)
NO_INDEX_FFS ヒントも指定することで INDEX FULL SCAN は回避できるで しょう。でもその前に、索引作成後に統計情報はちゃんと取得しましたか?
- dda167
- ベストアンサー率76% (55/72)
> トラブル発生前は該当SQLはINDEX RANGE SCANを使用していた 10gにバージョンアップした後、 数日間はINDEX RANGE SCANだったということですね? > トラブル対処として、ヒント句を使用すると、INDEX FULL SCANになってしまい ヒントの書き方は間違っていないのですね? # 質問の内容がわかるようなタイトルをつけていただく # わけにはいかないですか?
補足
回答ありがとうございます。 >10gにバージョンアップした後、 >数日間はINDEX RANGE SCANだったということですね? はい。 INDEX RANGE SCANだったものが、ある瞬間からINDEX FULL SCANになったそうです。 おそらくバインドピークのデメリットが顕著にでてしまったと想像してます。 >ヒントの書き方は間違っていないのですね? はい。 表名+インデックス名を書いてました。 # 質問の内容がわかるようなタイトルをつけていただく # わけにはいかないですか? タイトルをつけないで投稿してしまい、1行目がタイトルになってしまいました。 今後、気をつけたいとおもいます。
補足
回答ありがとうございます。 NO_INDEX_FFSだと、Fast Full Index scansだけが回避されるのかと思ってました。 INDEX FULL SCANも回避できるのですね。 他プロジェクトなので、簡単には試せませんが、自プロジェクトで環境を作って試してみたいと思います。 >でもその前に、索引作成後に統計情報はちゃんと取得しましたか ORACLEデフォルトと22時で自動取得しているそうです。 10g移行後数日間や、トラブル当日の午前中は、それなりに動いていた(性能がでていた)そうなので、バインドピークのハードバースで ハズレをひいたのか? と想像しています。