- 締切済み
oracle(SQL)のHINT指定について
性能問題について対応しています。 約2000万件のマスタと付随する各テーブルを結合して、検索条件に一致するデータを抽出するSQLを開発していますが、これらのパターン(曖昧検索:前方一致)において、前述の2000万件のマスタが駆動表となり、且つフルスキャンが走るものがあり、改善策を検討しています。 つきましては、HINT指定で駆動表を強制的に各テーブルに変更する方法(SQLのHINT指定内容)についてお教え願います。 →曖昧検索条件にもっとも絞られる対象のテーブルを駆動表とし、マスタテーブルはその駆動表とプライマリーキーで結合した形でアクセス(フルスキャンを避ける)ような実行計画となるSQLに改善をしようとしています。 以上です。
- aratani
- お礼率59% (19/32)
- Oracle
- 回答数2
- ありがとう数4
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
私なら、判りやすく・・ ORDERED オプション(FROMに書いたテーブルを左から右へ向かって結合) INDEX オプション (指定索引の利用を強要) でコントロールすることを試みます。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
テーブルの構造やSQL、実行計画を見ずに、具体的なオプティマイザヒントの指定内容を示すことなど出来ません。 たぶん、頭の中に”理想的な実行計画”がイメージ出来ていて、それに近づけたいということだと思いますので、 オプティマイザヒントの指定の意味をマニュアルで読んだ方が速いんじゃないですかね。
補足
ありがとうございます。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文を作るSQL”の書き方ってありますか?
“SQL文を作るSQL”の書き方ってあるのでしょうか? 例えばなのですが、表同士を大量に結合して条件に当てはまったものをアップデートするようなSQLを書く場合、文法を間違うとエライこちゃ!になる場合がありますよね。 そういう場合って結合するんじゃなくて結合したSELECT文を使って条件だしをして1件1件単純アップデートをした方が安心ですよね。 (定期処理であれば効率が悪いですが・・・だったらプロシージャですか・・・というところになりますがごくたまにや1回きりのデータ変更など) そういったことをやるほうほうはありますでしょうか? 仕様はSQL99です。
- ベストアンサー
- Oracle
- ORACLEでのSQL、シンプルな方法は?
ORACLEでのSQL文について質問です。 SQLで条件に合うレコードがあるかどうかはどう判別するのでしょうか? 画面で2つの条件を選んで テーブル ・ステータス ・フラグ 条件に合うレコードがなければINSERT 条件に合うレコードがあればUPDATE レコードが元々あるが、画面で指定された条件から外れる場合はDELETE としたいのですが、うまくSQLが書けません。 レコードがあればupdate、なければinsertするというのは多いのですが。 何かシンプルな方法はないでしょうか。
- 締切済み
- Oracle
- オラクル+SQL Plus
SELECT A FROM AAA WHERE ROWNUM<=5とSQLを実行すると 必ず5つ返ってくるとは限らないみたいで… テーブル名やフィールド名が分かっている状態で 何万件ものデータベースから指定した個数だけ返ってくるような SQL文があるのであれば教えてください。 個数さえ合っていれば順番は特に気にしません。 よろしくお願いします。
- 締切済み
- その他(データベース)
- Oracle 11でSQLで応答がなくなる
Oracle 11.2.0.1ですが12万件ある1つのテーブルが急にSQLで応答がなくなります。 それまでは、順調に動作しており、新規作成してデータ移行しRENAMEすると応答し正常に検索されますが また、数日すると同じ症状でSQLで応答がなくなります。 11.2は、、「オプティマイザ・フィードバック」という機能に関するバグらしく、この機能をOFFしました。 その後でもSQLで応答がしなくなっています。(1テーブルのみ)再起動済みです。 解決方法がないですか? また、手っ取り早い方法があれば伝授願います。
- 締切済み
- Oracle
- SQL文で質問
SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。
- ベストアンサー
- SQL Server
- 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 夜遅くにすみませんがお願いします。
- ベストアンサー
- SQL Server
- 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がわかりません。 どうかよろしくお願いします。
- 締切済み
- Oracle
補足
ORDERED オプションは、ルールベースの場合に有効と認識しています。私の環境ではCHOOSEモード(統計情報があり解析ができる場合はcostをベースとなる)なのです。 調査結果、LEADING指定、USE_NL指定で結合条件と駆動表を指定することで、2000万件のフルスキャンを回避、処理時間も大幅に短縮ができました。