実行計画HASH JOIN RIGHT OUTERとは?適切な実行計画とは?

このQ&Aのポイント
  • 実行計画HASH JOIN RIGHT OUTERとは、SQLの実行計画の一部であり、右外部結合を行うための方法です。
  • TABLE-Bの件数が少ない場合、TABLE ACCESS FULLでも問題ない場合があります。
  • 適切な実行計画は、実際のデータ量や条件によって異なりますが、他の結合方法やインデックスの利用などを検討することが重要です。
回答を見る
  • ベストアンサー

実行計画HASH JOIN RIGHT OUTER

以下のようなSQLがあるとします。 ------------------------ SELECT * from (select * from TABLE-A where 条件色々) AA, TABLE-B BB where BB.x(+) = AA.x ------------------------ TABLE-Aの件数は非常に多く(例100万)、条件は複雑です。 TABLE-Bの件数は少ないです(例30件) この時、実行計画が HASH JOIN RIGHT OUTER TABLE ACCESS FULL TABLE-B のように出ましたが、どのように解釈すれば良いのでしょう? TABLE-Bは件数が少ないのでACCESS FULLでも問題ないでしょうか? HASH JOIN RIGHT OUTER のコストが高くなってて気になってます。 たとえば、この場合のより適切な実行計画ってありますか?

  • evaan
  • お礼率45% (32/71)
  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.1

> この時、実行計画が > HASH JOIN RIGHT OUTER > TABLE ACCESS FULL TABLE-B > > のように出ましたが、どのように解釈すれば良いのでしょう? AAとBBをハッシュ外部結合した。 > TABLE-Bは件数が少ないのでACCESS FULLでも問題ないでしょうか? たかが30件ですからね。。 > たとえば、この場合のより適切な実行計画ってありますか? 「*」の部分が本当に「*」で、AAの件数(条件色々で絞り込んだ結果)が 極めて大きいなら、他の実行計画は考えにくいです。 # TABLE-Aの件数は非常に多く(例100万)、条件は複雑です。 従って、この部分をなるべく高速に返せるようにすることが重要です。

evaan
質問者

お礼

ご回答ありがとうございました。 ハッシュ結合の場合、小さい方のテーブルは必ずACCESS FULLになるようですね。 知識不足でした。

関連するQ&A

  • OUTER JOIN、WHEREとCOUNTの併用

    SQL文で Aテーブル 1 a 2 b Bテーブル 1 a null 2 a aa 3 b null 4 b bb があり、 AとBをJOINして取得したいのですが、 最終的にAテーブル一覧と、Bテーブルのaaがある項目だけをSelectしてきたいと思っております。 Select結果: 1 a 1(←aaのcountのみ) 2 b 0(←bbやnullなら0) しかし、普通にOUTER JOINして、Whereすると、 bの項目が取得できなかったり、します。 上記のようなデータを取得することは可能でしょうか?

  • Left outer join とかのLeft

    Left outer join とright outer join ですが、解説などをみると、左右に表が描かれてあって、線を引いたりして結合していくのですが、 何をもって左とか右とかいうのでしょうか? テーブル1が左で、テーブル2が右みたいな感じで解説されるのですが、先に出てきた1も、あとに出てきた2も、単に出てきた順番であり、記号と思われます。1と2を入れ替えたら同じことです。Left outer join Table1 もRight outer join Table2 も同じことのように思われます。私はなにか勘違いしているのでしょうか?

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • OUTER JOINについて

    こんにちわ。 OUTER JOINを使ったSQL文について質問させてください。 今3つのテーブル(EMPLOYEES, CUSTOMERS, ZIPCODES)があるとします。郵便番号ごとに従業員とお客さんのIDを表示するSQLはわかるのですが(下に書きます)、郵便番号ごとに従業員とお客さんの数を表示するSQL文がわからず、途方に暮れてます。どなたか教えていただけないでしょうか? よろしくお願いいたします。 郵便番号ごとに従業員とお客さんのID SQL> select z.zip, e.eno, c.cno from zipcodes z full outer join employees e on (z.zip=e.zip) full outer join customers c on (z.zip=c.zip); ZIP ENO CNO ---------- ---------- ---------- 49008 1001   1111 49009    2222 49001 1000 3333 49017 1002 49023 49024 それをこうしたいのですが・・ ZIP ENUM CNUM  ---------- ---------- ---------- 49008 1 1 49009 1 49001 1 1 49017 1 49023 49024

  • 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ではどのように表記したら良いのでしょうか? 教えてください。 宜しくお願いします。

  • 多数のテーブルでのFULL OUTER JOIN

    SQL Sever 2005 を利用しております。5つのテーブルから値を取得するSQL文を作成したいと考えております。3つまでのテーブルのFULL OUTER JOIN は例がるのですがそれ以上となると調べても判りませんでした。ご教授お願い致します。 TABLE1~TABLE2は同じ構成で発生した5つのテーブルを1つのテーブルに合体して データどれか1つのテーブルで発生すれば表示したい。 出来れば現在作成中のSQL文がFULL OUTER JOINで作成しているのでこれを流用したいので FULL OUTER JOIN の方法で教えて頂ければ幸いです。 以上よろしくお願い致します。 (※IDが主キー) テーブル名:TABLE1 ID-----金額 ----------- 01-----1000 11-----2000 テーブル名:TABLE2 ID-----金額 ----------- 02-----2000 12-----3000 テーブル名:TABLE3 ID-----金額 ----------- 03-----3000 テーブル名:TABLE4 ID-----金額 ----------- 02-----1000 04-----4000 テーブル名:TABLE5 ID-----金額 ----------- 01-----1000 05-----5000 作成したいSQL文の結果 ID-----TABLE1金額---TABLE2金額---TABLE3金額---TABLE4金額---TABLE5金額 01-----------1000----------------------------------------------------1000 02-------------------------2000------------------------1000 03----------------------------------------3000 04-----------------------------------------------------4000 05-------------------------------------------------------------------5000 11-----------2000 12-------------------------3000

  • OUTER JOIN と TOP10との組み合わせ

    LEFT OUTER JOIN と TOP10との組み合わせ テーブルAと LEFT OUTER JOIN するテーブルBがあり、 単にLEFT OUTER JOINすると、 レコードA01 レコードB01 レコードA01 レコードB02 レコードA01 レコードB03 のようにレコードBに対し、該当する同じレコードAが複数取得されます。 この状態でTOP10をかけると、テーブルAのTOP10が欲しいのに、 テーブルBも混じった数で取得されてしまいます。 (テーブルAは10レコード取得できない) これをテーブルAのTOP10を取得して、それにJOINするテーブルBの数は問わない方法は可能でしょうか?

  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • LEFT OUTER 外部結合で一致しない値も表示

    select table1.*, table2.no from table1 inner left outer join table2 on table1.id = table2.no 上記の文を使って、一致した値がなくても、 すべて表示させた表を完成させたいのですが、 エラー #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left outer join table2 on table1.id = table2.no~ が出てしまいます。 何がいけないのか、LEFT OUTERなしでやってみると、 きちんと値が返ってきました。 詳しい方いらっしゃいましたら、どうかお知恵を貸してください。 お願いいたします。

    • ベストアンサー
    • MySQL