• 締切済み

oracle(SQL)のHINT指定について

性能問題について対応しています。 約2000万件のマスタと付随する各テーブルを結合して、検索条件に一致するデータを抽出するSQLを開発していますが、これらのパターン(曖昧検索:前方一致)において、前述の2000万件のマスタが駆動表となり、且つフルスキャンが走るものがあり、改善策を検討しています。 つきましては、HINT指定で駆動表を強制的に各テーブルに変更する方法(SQLのHINT指定内容)についてお教え願います。  →曖昧検索条件にもっとも絞られる対象のテーブルを駆動表とし、マスタテーブルはその駆動表とプライマリーキーで結合した形でアクセス(フルスキャンを避ける)ような実行計画となるSQLに改善をしようとしています。 以上です。 

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

みんなの回答

回答No.2

私なら、判りやすく・・ ORDERED オプション(FROMに書いたテーブルを左から右へ向かって結合) INDEX オプション (指定索引の利用を強要) でコントロールすることを試みます。

aratani
質問者

補足

ORDERED オプションは、ルールベースの場合に有効と認識しています。私の環境ではCHOOSEモード(統計情報があり解析ができる場合はcostをベースとなる)なのです。 調査結果、LEADING指定、USE_NL指定で結合条件と駆動表を指定することで、2000万件のフルスキャンを回避、処理時間も大幅に短縮ができました。

回答No.1

テーブルの構造やSQL、実行計画を見ずに、具体的なオプティマイザヒントの指定内容を示すことなど出来ません。 たぶん、頭の中に”理想的な実行計画”がイメージ出来ていて、それに近づけたいということだと思いますので、 オプティマイザヒントの指定の意味をマニュアルで読んだ方が速いんじゃないですかね。

aratani
質問者

補足

ありがとうございます。oracle8のマニュアルを見ましたがいまいち理解できません。 LEADINGオプションが該当しますかね?

関連するQ&A

  • SQL Server7.0での特殊な結合演算子について

    最近、SQLServer7.0をいれて勉強しています。 http://www.techscore.com/tech/sql/index.html を参考に勉強しています。 そこの特殊な結合演算子の自然結合,指定結合ができません。 受注表、顧客表は「テーブルの結合」のところのテーブルを作成しました. NATURAL JOINの結合やON句を使う指定結合をやると 「列のプレフィックス '受注表' は、テーブル名と一致しないか、クエリ内の別名と一致しません」 というエラーがでます。WHERE句を使った結合だとできます。 何が問題なのでしょうか。 参考HPには「SQL92はある種の共通する結合操作を簡単に実行できるように、特別な構文を用意している」 とかいてあるですが、 SQLServer7.0にはバージョンが古すぎてSQL92がないってことなんでしょうか。 SQLServerをはじめたばかりなので、あまりくわしくないのですが、是非ともご教授よろしくおねがいします。

  • SQLについて

    以下の二つのテーブルの内、Bテーブルの"id (プライマリーキー)"の情報を元に、Aテーブルの"メールアドレス"を調べて、 特定のメールアドレスに一致した場合にBテーブルの"メールアドレス"を返す効率の良いSQLを教えてください。 [Aテーブル] id (プライマリーキー) メールアドレス [Bテーブル] id (プライマリーキー) Aテーブルのid メールアドレス

    • ベストアンサー
    • MySQL
  • “SQL文を作るSQL”の書き方ってありますか?

    “SQL文を作るSQL”の書き方ってあるのでしょうか? 例えばなのですが、表同士を大量に結合して条件に当てはまったものをアップデートするようなSQLを書く場合、文法を間違うとエライこちゃ!になる場合がありますよね。 そういう場合って結合するんじゃなくて結合したSELECT文を使って条件だしをして1件1件単純アップデートをした方が安心ですよね。 (定期処理であれば効率が悪いですが・・・だったらプロシージャですか・・・というところになりますがごくたまにや1回きりのデータ変更など) そういったことをやるほうほうはありますでしょうか? 仕様はSQL99です。

  • ORACLEでのSQL、シンプルな方法は?

    ORACLEでのSQL文について質問です。 SQLで条件に合うレコードがあるかどうかはどう判別するのでしょうか? 画面で2つの条件を選んで テーブル ・ステータス ・フラグ 条件に合うレコードがなければINSERT 条件に合うレコードがあればUPDATE レコードが元々あるが、画面で指定された条件から外れる場合はDELETE としたいのですが、うまくSQLが書けません。 レコードがあればupdate、なければinsertするというのは多いのですが。 何かシンプルな方法はないでしょうか。

  • オラクル+SQL Plus

    SELECT A FROM AAA WHERE ROWNUM<=5とSQLを実行すると 必ず5つ返ってくるとは限らないみたいで… テーブル名やフィールド名が分かっている状態で 何万件ものデータベースから指定した個数だけ返ってくるような SQL文があるのであれば教えてください。 個数さえ合っていれば順番は特に気にしません。 よろしくお願いします。

  • SQLの高速化

    SQLの高速化に関する情報を教えてください! 結合する時、どっちのテーブルを=の左にする(これ、分かりません・・・)、とか、多くのテーブルとテーブルの結合条件を書く際、WHEREに近い方にどういう結合条件を持ってきたらいい、とか、WHERE句を評価する時のDBの検索の仕組み(順番)とか・・・基本的なとこから全部知りたいです! ↑これは適当に言っていることであって、このような感じの情報がもしあれば、知りたいということです。 どうかお願いいたします。

  • Oracle 11でSQLで応答がなくなる

    Oracle 11.2.0.1ですが12万件ある1つのテーブルが急にSQLで応答がなくなります。 それまでは、順調に動作しており、新規作成してデータ移行しRENAMEすると応答し正常に検索されますが また、数日すると同じ症状でSQLで応答がなくなります。 11.2は、、「オプティマイザ・フィードバック」という機能に関するバグらしく、この機能をOFFしました。 その後でもSQLで応答がしなくなっています。(1テーブルのみ)再起動済みです。 解決方法がないですか? また、手っ取り早い方法があれば伝授願います。

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • SQLの書き方

    はじめまして SQL Serverを使用していますが、下記のSQLの書き方がわかりません。 申し訳けありませんが、わかる方がいらっしゃいましたら、どなたか教えて下さい。 ◆質問 テーブル1とテーブル2の下記のKEYで結合させて、取り出した結果でテーブル3を更新したいです。 テーブル2はデータが複数件一致してしまうため、無条件に先頭の1レコードだけを取り出したいです。 取得できたテーブル2のid_1とid_2とid_3をテーブル3に書き出したいです。 ○KEY テーブル1.test = テーブル2.test and テーブル1.test1 = テーブル2.test1 テーブル1.id_2 = テーブル3.id_1 and テーブル1.id_3 = テーブル3.id_2 ○テーブル1 id_1   id_2   id_3   test   test1 bbb   000001   001   000001  100 bbb   000002   001   000002  100 ○テーブル2 id_1   id_2   id_3   test   test1 aaa    1    99    000001   100 ← このレコードを取り出したい aaa    2    99    000001   100 aaa    3    99    000003   100 aaa    4    99    000004   110 ○テーブル3 id_1   id_2   id_3 000001  001  aaa-1-99   ←id_3にテーブル2で取得できたid1 + id2 + id3を書き出したい 000002  001 夜遅くにすみませんがお願いします。

  • oracle sqlで先頭の1件を取得

    こんにちはみなさん。 現在、Oracle10gR2を使用しています。 そこで、以下のようなテーブルが存在します。 table_A(明細テーブル) denday | cd | suu | kingaku 2011/03/05 | 1| 1| 1000 2011/03/10 | 1| 2| 2000 table_B(マスタ) cd| henkoday | nm 1 | 2011/03/01| testA 1 | 2011/03/02| testB 1 | 2011/03/06| testC 上記マスタはcd、henkodayで管理しています。 上記table_Aとtable_Bを結合したいと思います。 そこで select t1.* ,t2.* from (select * from table_A order by denday) t1, (select * from table_B order by cd,henkoday desc) t2 where t1.cd=t2.cd and t1.denday>=t2.henkoday とした場合、マスタの3件分、明細データの重複ができてしまいます。 それを、直近の該当マスタのみ参照したいのですが、 以下のようなデータ抽出 table_A(明細テーブル)     table_B(マスタ) denday | cd | suu | kingaku | cd | henkoday | nm 2011/03/05 | 1 | 1 | 1000 | 1 | 2011/03/02 | testB 2011/03/10 | 1 | 2 | 2000 | 1 | 2011/03/03 | testC そのSQLがわかりません。 どうかよろしくお願いします。