• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ヒント句が無効になります)

スクラッチでのSQL文におけるヒント句の有効化方法について

uresiiwaの回答

  • ベストアンサー
  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.1

「スクラッチにおけるSQL文」の意味がはっきり分からなかったのですが、「手組みのアプリケーションの処理から発行されたSQL」と解釈しました。それが、「同様なSQLをオブジェクトブラウザから実行」した場合で速度に差があるが何故か、ということですよね。 サーバ側の環境が同じで、かつ、SQLが一言一句同じであれば、一方だけ実行計画が異なるということは決してなく、特に速度に差も出ません。 オブジェクトブラウザとヒント句に特別な相関はないです。 【考えられること】 1.実はSQLが違う 2つのSQLは、どこかに違いがあるのでは? 改行や空白の違いは無視してよいですが、ありがちなのは、オブジェクトブラウザからはWHERE句をリテラルで(WHERE STATUS='A'のように)指定し、アプリでは変数・バインド値で指定されている(WHERE STATUS=:1のように)場合です。ヒント句は全体の実行計画を後押しする「ヒント」に過ぎないため、ほかの部分が変わってしまうと実行計画が変わることがあります。特に、バインド値とリテラル値の違いは、オプティマイザにとってかなり大きな違いがあります。 2.バインドされている値が違う 万一SQLが同じの場合は、バインドされている値が違う(WHERE STATUS=:1の:1にバインドされるのが一方がA、一方がBなど)ということになりますが、さすがにそれはないですよね。レスポンスが違ってあたりまえですので。 【行うべきこと】 1.アプリが実際に実行しているSQLの抽出 A案. データベースにトレースをかけて、それぞれのSQLを実行したときにトレースに現れるSQLおよび実行計画を抽出し、比較してください。どこかに違いがあると思います。なお、実行計画も見るためにはレベル12のトレースにする必要がありますが、DB負荷が高くなる(約1.5倍ぐらい遅くなる)のでお気をつけください。 B案. OEMが使えるのであれば、「トップアクティビティ」を監視しながらアプリを実行すれば、お手軽にアプリが実行しているSQLと実行計画が抽出できます。 C案. v$sqlというビューを使って、実行されているSQLを抽出してみてください。 例) select sql_text, executions from v$sql アプリを実行した時にexecutionsがアップするのを探せば当該SQLが見つかると思います。sql_text like '%思い当たる文字列%'も良いです。 2.アプリ側が実際に実行していたSQLをオブジェクトブラウザから実行する もし、アプリ側SQLが分かったら、オブジェクトブラウザに貼り付けてSQLを実行してみてください。アプリ動作時と同じレスポンスになります。

hirocwata
質問者

補足

uresiiwa様 ご回答ありがとうございます。 uresiiwa様のご指示通り、アプリが実際に実行しているSQLの抽出を行いました。 方法としては、ローカル環境でデバッグを用い、SQLを実行しているところにデバッグポイントを設け、中身を確認しました。 そこで表示されているSQLをオブジェクトブラウザに貼り付け、実行したところ、10秒近くかかっていました。 ただし、表示されているSQLをバインド値からリテラル値に変更するとアプリと同じ程度のレスポンスがえられます。(アプリではバインド値として表示されています。) また、システムエラーログでは、問題となっているSQLの''(クォーテーションマーク)や、<>(不等号記号)が変換されて表示されています。 (どのような文字に変更されているかは手元に資料が無いので詳しくはお答えできません。) ひょっとすると、そういった違いが影響しているのかもしれないと思っているのですが、その可能性はありえますか? (ちなみに、オブジェクトブラウザ上では、記号が変換された後のSQLを実行しようとすると実行できません。) お忙しいところ、無知のため、たびたびお手を煩わしてしまい、申し訳ありませんが、お教えいただけますようよろしくお願いします。

関連するQ&A

  • アナライズとヒント句

    sqlのselectが長時間にわたって終了しないのでヒント句でHASH指定をしたところ、アナライズのサンプルレートにより効いたり、効かなかったりします(実行計画で確認)。こんなことはあるのでしょうか。 ちなみにoracle10G-R2です。

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

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

    いつもお世話になっています。 oracle9iR2を使用しています。 速度アップのためチューニングが必要なsqlが指摘されたのですが、 あるカラムにインデックスを作成すべきとの指摘がありました。 インデックスを作成するだけである程度改善される場合もあるのでしょうか? それともインデックス作成後、対象のsql/に、*+INDEX・・・ などのように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読み込みでは、他の書き方があるのでしょか? どなたか、ご教授お願いします。

  • 「文字が無効です」になる

    PG初心者です。 SQLで下記のような文を実行すると「文字が無効です」というメッセージが出てしまいます。 WHERE句より前は間違っていないようです。 ""で括ったテーブル名等も間違いないことを確認済です(文字は伏せます)。 となると{ts…以下になると思いますが、何がまずいのでしょうか。 WHERE ("*****"."@@@_@@@@">={ts '1998-07-02 00:00:00'} AND "*****"."@@@_@@@@"<{ts '1998-07-03 00:00:00'})

  • 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.(+)

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

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

  • オラクルのhint語について

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

  • PL/SQLでFROM句に変数を使いたい

    PL/SQL初心者なので方法があるかないかもわかりません。 SELECT TABLE_NAME FROM USER_TABLES で取得したテーブルを PQL文に使用したいのですが可能ですか? 一応動的(DBMS_SQLを使用した方法)にSQLを作成することはできたのですが パフォーマンスを考えると静的に使用したいのです。 動的、静的の表現でいいのかわかりませんが普通に PL/SQL中にSQL文を使いたいんですがいかがでしょうか?

  • IN句に副問合わせを使う場合と使わない場合

    お世話になります。 SQLについての質問です。 RDBMSはSymfowareです。 IN句に副問い合わせを指定するSQLと その副問い合わせの結果を直接IN句に記載したSQLで 結果が異なってしまいます。 こういうことってありますでしょうか。 以下のようなSQLです。 (1) SELECT * FROM T1 WHERE T1.column_A IN ( SELECT T2.column_A FROM T2 WHERE T2.column_B='XXXX' ) 上記IN句内のSELECT文の結果は、'A'、'B'、'C'、'D'です。 (2) SELECT * FROM T1 WHERE T1.column_A IN ('A','B','C','D') この(1)、(2)のSQLの結果が異なってしまいます。 私の環境では(1)では0件、(2)では2件ヒットします。 なぜこのようになるのかわかる方がいらっしゃいましたら ご教授ください。 ちなみに、DBを操作して、副問い合わせのSELECT文の結果を 'A'、'B'とすると同じ結果が得られます。 副問い合わせのSELECT文の結果が3件以上になると(1)のSQLの 結果は0件になってしまいます。 RDBMSの障害でしょうか・・・? それとも、IN句に副問い合わせを使用する場合、 その副問い合わせの結果は2件以下にする必要がある なんてルールがあったりするのでしょうか。