• 締切済み

オラクルのhint語について

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

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

2つのテーブルの結合条件があると思います。それに使える索引が存在するかどうか。 後、where句でテーブルA、Bがどれくらい絞り込めるかが分からないと適切な実行プランが割らりません。 たとえば、テーブルAでnameが条件なっていて、テーブルBでageが条件になっていて、結合条件のカラムにINDEXがない場合、テーブルBで絞り込める件数が少なければ、 SELECT /*+ INDEX( テーブルA name ) INDEX( テーブルB age ) USE_HASH( テーブルA テーブルB ) */ になると思います。 しかし、結合にINDEXが使えるなら、そのINDEXを用いた INDEX、USEL_NLヒントを指定した方が実行コストは小さいでしょう。

関連するQ&A

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • オラクルで外部結合

    オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;

  • あいまい検索のパフォーマンス向上について

    あいまい検索(部分一致)検索をする際に、あいまい検索だとインデックスも効かないので、インデックスを張ってパフォーマンス向上という訳にもいかず、パフォーマンスが非常に悪くて困っています。 状況としては、WEBアプリケーションで、検索画面から検索条件を入力し、「Find」ボタンを押下するとJavaでSQLを発行し、Oracleへ接続するという仕組みのシステムです。 下記のようなケースで、後者のSQLに変更するとガツンとパフォーマンスが向上したのですが、偶然でしょうか? 【もともとのSQL】 select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' and name like '%山%' and address like '%中央区%' / 【パフォーマンスが向上したSQL】 select * from (select name ,age ,sex ,blood_type ,address from TABLE1 where age >= 20 and age < 30 and blood_type = 'A' ) where name like '%山%' and address like '%中央区%' / というふうに、あいまい検索部分を別出ししました。 WHERE句の条件をANDでたくさんつなげる際に、2度の問い合わせにはなりますが、一度あいまい検索以外の条件で絞り込んで、それから再度その結果に対してあいまい検索を実施した方が早いのではないかと思ってやったところ実際に早くなったのですが、これは偶然でしょうか? 件数が増えると逆に遅くなるとかだと、逆効果なので、理論的にはどうなのか、ご存知の方がいらっしゃったら教えてください。 また、実際にはテーブルではなく、VIEWに対しての検索で実施しました。 よろしくお願い致します。

  • Oracle[10g]のSQL文について(改めて)

    すみません。[B]テーブルの作成がおかしい様でしたので、 改めて質問させて下さい。 Oracle[10g]のSQL文についての質問です。(No.???) [A]テーブルに [CODE](KEY) [CODE2] [NAME] のフィールドがあります。 A-1 B-1 NAME-1 A-2 B-2 NAME-2 A-3 B-3 NAME-3 [B]テーブルに [CODE3](KEY) [NAMEB] のフィールドがあります。 B-1 NAME-B-1 B-2 NAME-B-2 [C1]テーブルに [NO](KEY) [LINE](KEY) [CODE] のフィールドがあります。 X 1 A-1 X 2 A-3 Y 1 A-2 結果が [NO/LINE/CODE/NAMEB] X 1 A-1 NAME-B-1 X 2 A-3 (NULL) と、なる様にしたいのです。 SELECT C1.NO, C1.LINE,C1.CODE, Tx.NAMEB FROM C1 , ( SELECT C1.CODE, TNMx1.NAMEB FROM C1, ( SELECT CODE, CODE2, CODE3, NAMEB FROM A, B WHERE A.CODE2 = B.CODE3 ) TNMx1 WHERE C1.NO = 'X' AND C1.CODE = TNMx1.CODE(+) ) Tx WHERE C1.NO = 'X' GROUP BY C1.NO, C1.LINE,C1.CODE, Tx.NAMEB と、考えたのですが、何故か結果が X 1 A-1 (NULL) X 1 A-1 NAME-B-1 X 2 A-3 (NULL) X 2 A-3 NAME-B-1 4行もでてしまいます。 問題は、[B]テーブルです。 宜しくお願い致します。

  • select文でGROUP BYの正しい使い方

    下記のselect文は問題ないでしょうか?テーブルには5つのフィールド(id,name,age,gender,office)が存在します。 select * from テーブル名 where age >= '40' GROUP BY gender 実際に試したところ、うまく動いているのですが、GROUP BY句で指定されたフィールド名はSELECT句のフィールド指定をすべて含んでいなくてはならないと書かれているのを見つけました。 上記のselect文は正しいのでしょうか。

    • ベストアンサー
    • PHP
  • postgresのouter join(?)について

    やまとです。 以下のようなテーブルと、そのデータが有ります。 a_table ============ id | a_name ---+---------- 1 | hanako 2 | taro b_table ============ id | b_name ---+---------- 1 | yamada select a_name,b_name from a_table a, b_table b where a.id = b.id 以上のようなselect文だと、以下の様に出ますが、 a_name | b_name -------+------- jo | koba 実際は、以下の様に結果を出したいのです。 a_name | b_name -------+------- jo | koba taro | ORACLEだと where a.id = b.id(+) で出ると思いますが、 Postgresではどのように表記したら良いのでしょうか? 教えてください。 宜しくお願いします。

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • 該当データが存在しないときに、全件検索を回避するには?

    たとえば、以下のA01KINGAKUテーブルがあったとして KAISHA CHAR(2) (主キー) KINGAKU NUMBER(15) このテーブルに1万件のデータが入っていて 各レコードのKAISHA項目は、全て 'A1' だったとしたとき Select * from A01KINGAKU where KAISHA = 'A2' としたときに、 インデックスをみれば、A2が存在しないというのは すぐにわかりそうなものですが、 Oracle 10gで、これをしたら、全件検索されてしまいました。 (統計情報は直前に取得済みです) たぶん、インデックスの値に散らばりがないので インデックスを使わないという判断になったのだと思いますが インデックスを強要する術はないでしょうか? /*+index(A01KINGAKU インデックス名)+*/ とすればよいのでしょうが こうしたことを多数のテーブルについてやりたく いちいちインデックス名を調べるのがわずらわしく インデックス名がいらないヒントの方法あるいは ヒントとはまったく違った方法を探しています。 (そもそもそんなもの主キーにするなとか、質問の意図が読めないというご意見もあるかと思います。 元は、ALLKINGAKUテーブルという複数のKAISHAコードを扱うテーブルがあって、これを処理速度向上のため、 KAISHAコードごとにテーブルを分割し、 ALLKINGAKUテーブルを廃止して、代わりに select * from A01_KAISHA union all select * from A02_KAISHA ... としたALLKINGAKUビューを作成したと思ってください。 この時、Select * from ALLKINGAKU where KAISHA = 'A02'としたときに、ビュー上で、A01_KAISHAまで全件検索されてしまったことに 端を発している質問です)

  • オラクル結合SQL

    こんばんわ。オラクル初心者です。 オラクル9.1で、下記のようにtable1とtable2を結合して、view1(oracleビュー) を作成したいのですが、どのようなSQLがよいでしょうか。 なかなかうまい方法がなくてこまっています。 table1 no 項目 その他 その他1 1   1 1  2 1  3 .....省略 table2 no 項目 種別 結果 1  1  01  3 1  1  02   8 1  1   03  7 1  2  01  9 1  2   02   6 1  2  03  2 1  3  01   1 ...... view1 良い例 no 項目 結果1 結果2 結果3 1   1   3   8   7    ←種別01 02 03を順にいれる 1   2  9   6  2 1  3  1............ select table1.no,table1.項目,・・・ from table1,table2 where table1.no = table2.no and table1.項目 = table2.項目 ↑おおよそこのような感じになるとは思ってます。 何とか頑張ったのですが、下記のようになってしまうことが 多かったです・・・。どこかSQLがわるいようです。 view1 悪い例 no 項目 結果1 結果2 結果3 1  1   3   8  7 1  1   3   8  7 1  1   3   8  7 1   2  9  6  2 1   2  9  6  2 1   2  9  6  2 1   3  1............ もしご存知の方いらっしゃいましたら、助かります。よろしくお願いいたします。

  • OracleのViewの作り方

    OracleのViewについてですが。。 ‘あ行’という名前のテーブルと‘か行’という名前のテーブルがあるとします。 ‘あ行’テーブルには‘あ’,‘い’,‘う’という列名があり、 ‘か行’には‘か’,‘き’,‘く’,‘あ’,‘い’という列名があるとします。 以上の2つのテーブルから‘ひらがな’というViewを作りたいとします。 このViewの条件としては‘あ行’から‘あ’,‘い’をselectし、‘か行’からは‘あ行’と‘か行’のそれぞれの‘あ’列の項目が同じであるレコードから‘か’と‘あ’と‘い’をselectしてきます。この時‘あ’という列の項目内容は分かっていて、その項目が記載してあるレコードに‘い’の項目内容をupdateしたいとするとどのようにViewを書けばよいのでしょうか?あくまでもそれぞれのテーブルに直接‘い’項目を書くのではなくてViewにおいてUpdateで書きたいのですが。