oracle10gバージョンアップ後のSQLトラブル

このQ&Aのポイント
  • oracle10gにバージョンアップを行った後、数千万件のデータにバインド変数でアクセスするSQLがインデックスを使用せずにフルアクセスしてしまうトラブルが発生しました。
  • この事象はCBOのデメリットと考えられます。
  • ヒント句を使用してもINDEX FULL SCANとなり、むしろ遅くなってしまいます。明示的にINDEX RANGE SCANを適用させる方法はあるのでしょうか?
回答を見る
  • ベストアンサー

いつもお世話になってます。

いつもお世話になってます。 他プロジェクトのまた聞きなのですが。。。。 oracle9iからoracle10gにバージョンアップを行いました。 数日後、数千万件にバインド変数でアクセスするSQLがインデックスを使用せず、フルアクセスしてしまい、トラブルとなりました。 この事象はCBOのデメリットなので、納得なのですが。 1.トラブル発生前は該当SQLはINDEX RANGE SCANを使用していた。 2.トラブル対処として、ヒント句を使用すると、INDEX FULL SCANになってしまい、結果として遅くなってしまった。 前置きが長くなりましたが、ヒント句を使用してINDEX FULL SCANになってしまった場合、明示的にINDEX RANGE SCANを適用させる方法はあるのでしょうか? ネット検索してもそのような方法を見つけることができませんでした。

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

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

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.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.2

NO_INDEX_FFS ヒントも指定することで INDEX FULL SCAN は回避できるで しょう。でもその前に、索引作成後に統計情報はちゃんと取得しましたか?

nekotaru
質問者

補足

回答ありがとうございます。 NO_INDEX_FFSだと、Fast Full Index scansだけが回避されるのかと思ってました。 INDEX FULL SCANも回避できるのですね。 他プロジェクトなので、簡単には試せませんが、自プロジェクトで環境を作って試してみたいと思います。 >でもその前に、索引作成後に統計情報はちゃんと取得しましたか ORACLEデフォルトと22時で自動取得しているそうです。 10g移行後数日間や、トラブル当日の午前中は、それなりに動いていた(性能がでていた)そうなので、バインドピークのハードバースで ハズレをひいたのか? と想像しています。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

> トラブル発生前は該当SQLはINDEX RANGE SCANを使用していた 10gにバージョンアップした後、 数日間はINDEX RANGE SCANだったということですね? > トラブル対処として、ヒント句を使用すると、INDEX FULL SCANになってしまい ヒントの書き方は間違っていないのですね? # 質問の内容がわかるようなタイトルをつけていただく # わけにはいかないですか?

nekotaru
質問者

補足

回答ありがとうございます。 >10gにバージョンアップした後、 >数日間はINDEX RANGE SCANだったということですね? はい。 INDEX RANGE SCANだったものが、ある瞬間からINDEX FULL SCANになったそうです。 おそらくバインドピークのデメリットが顕著にでてしまったと想像してます。 >ヒントの書き方は間違っていないのですね? はい。 表名+インデックス名を書いてました。 # 質問の内容がわかるようなタイトルをつけていただく # わけにはいかないですか? タイトルをつけないで投稿してしまい、1行目がタイトルになってしまいました。 今後、気をつけたいとおもいます。

関連するQ&A

  • オプティマイザはどちらのモードで判断しているか調べる方法を教えてください。

    今回急遽Oracle(8.1.6です。)の運用保守を担当する事になったものです。 ここ1ヶ月あたり自分なりに必死でいろいろ情報を 集めているつもりなのですがどうしても分からない事があります。 アクセスパスを選択するにあたり、 CBO,RBOの2種類があると理解していますが、 実際にその設定はどこに定義されているのでしょう? 現在どちらが採用されてアクセスパスが導かれているか を調べるにはどうすればよいのでしょうか? 実行されるSQLが使用しているテーブルや、IndexのANALYZEが 行われていたら自動的にCBOになるのでしょうか? それともヒント文を記載しなければCBOになるのでしょうか? どなたか教えてください。

  • 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でした。 よろしくお願いします。

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

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

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

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

  • VB6.0 DAO ORACLE ヒント使用方法に付いて

    皆様、いつも御世話になっております。 OS : Windows 2003 Server 開発環境 : VB6.0 + Oracle9.2 ライブラリ : Microsoft DAO 3.6 Object Library DAOでODBC経由でOracleに接続し、 (接続文字列 DSN=XXXX;UID=XXXX;PWD=XXXX) ヒント句の部分がエラーになって困っております。 発行SQL文---------------------------------------------------- SELECT /*+ index( テーブル名 インデックス名) */ * FROM テーブル名 WHERE 各種条件 ORDER BY 順序指定 ------------------------------------------------------------- 発行したSQL文をコピーし、SQLPLUSで動作させた所、意図したとおりに動作しており、SQLの記述が間違っている訳ではないようです。 VBからのOracle読み込みでは、他の書き方があるのでしょか? どなたか、ご教授お願いします。

  • Oracle 実行計画について

    数千万件が格納されているテーブルにINDEXキーを新設して そのINDEXキーを条件句にもつSQL文にヒント句をつけて必ず参照するように変更し、 実行計画を取得したら、新設したINDEXキーを参照してはいるのですが、 逆にRowsやBYTESなどが増加してしまいました。 Rows | Bytes | Cost ⇒ Rows | Bytes | Cost    1 |  23  |  5      2862 |65826 |  16 ただ、体感速度はINDEXキーを新設した方が早いです。 この場合考えられる原因とは何がありますか? Oracle11gです。

  • ASP SqlDataSourceのWhere句

    ASP SqlDataSourceのWhere句についての質問です。 Visualsutudioを使用してWebFormを作成していますが、 SqlServerの場合とOracleの場合とで、Where句の記述が異なり(自動生成される)、 ビルド実行するとSqlServerはうまく実行されるのですが、Oracleの場合はエラー(Ora-00911)となってしまいます。 Oracleを使用して構築を行いたいので、色々と調べ色々と試してみたのですがOracleエラーとなってしまいます。 何かご存知の方は回答をお願いします。 SqlServerとOracleのWhere句については以下の通りです。 SqlServerのWhere句 ....WHERE ( [ NAME ] = @NAME ) " > OracleのWhere句 ....WHERE ( "NAME" = ? ) " >

  • DBロックを待ち続ける方法

    ロックがかかったテーブルに対して、 SELECT文を発行する際、ロックが解除されるまで 待ち続けるヒント句のようなものは SQL SERVERに存在するのでしょうか? (Oracleの「SELECT~FOR UPDATE文」に相当するものは  存在しないのでしょうか?) 使用しているDBはSQL SERVER 2000 です。

  • sql plusのダウンロードとインストール

    会社でOracleのデータベースを使用しているので、自宅で勉強しようと思いネットで検索したところ、制限はつくものの無料で使用することができる Oracle 10g Express Editionというものを発見し、早速インストールしてみました。 しかし、会社の研修ではsql plusというもので、操作を行っていたのですがこのOracle 10g Express Editionにはsql plusが入っていませんでした もしかしてこのOracle 10g Express Editionではsql plusは使用することができないのでしょうか? 参考書として、現場で使えるSQLという本に、Oracleのインストール方法とsql plusの使用方法は書いてあるのですが この本でインストールしているものはoracle database 10g release 2という30日間のみ使用可能なトライアル版であり 今回私がインストールしたOracle 10g Express Editionの説明ではありません。 この本にはoracle database 10g release 2をインストールすると スタートメニュー→プログラム→oracle -oraclient 10g_home1→アプリケーション開発→sql plusとう順番でsql plus起動させることができますが、私のPCにはスタートメニューにsql plusはありませんでした。 どなたかOracle 10g Express Editionでsql plusを使用する方法を知っているかたはいないでしょうか? 長文かつわかりにく文章で申し訳ございませんが教えていただけると幸いです。

  • Pro*cのバインド変数をカンマ区切りで指定できますか?

    Pro*cのバインド変数で下記のようなwhere句のinでカンマ区切りを指定することはできないのでしょうか? Oracle9iです。 適当な書き方で申し訳ありませんがよろしくお願いします。 ------------------------ EXEC SQL BEGIN DECLARE SECTION; const char *bindAAA; EXEC SQL END DECLARE SECTION; // bindAAAバインド変数に'1,2,3'という具合に格納 ↓のSQLを実行したい select * from AAA where BBB in (:bindAAA)