- ベストアンサー
オラクルで外部結合
オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;
- timber
- お礼率100% (1/1)
- その他(データベース)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
テーブル1とテーブル2のデータ量によって、処理速度が 変化する可能性があります。 テーブル1とテーブル2ともにレコード件数が少なければ たいした差は無いでしょうが、レコード件数が共に多く、 かつテーブル1とテーブル2のレコード数の差が大きければ レスポンスに変化があるでしょう。 「実測しましょう」というのが、最も間違いのない答え です。
関連するQ&A
- SQL 外部結合についての質問
SQLの外部結合についての質問です。 今テーブルA,B,Cがあるとします。 AはBに対して外部結合。BはCに対して外部結合 というようにする事は出来ますでしょうか。 SQLを実行してもエラーになります (例) select A.* from A,B,c where A.項目1 = B.項目1 (+) and B.項目2 = C.項目2 (+)
- 締切済み
- Oracle
- 巨大テーブルの外部結合
巨大なテーブル同士を結合する際に、みなさんはどのように結合されますか?もっともパフォーマンスのある方法を模索しているところです。 テーブルA:約900万件 テーブルB:約400万件 テーブルAのインデックスはカラム:idです。 テーブルBにはインデックスはありません。 取得したいのはBテーブルに含まれるAテーブルのidの件数です。 select count(id) from B where A.id = B.id なんてやると、数時間かかります。 select count(id) from B where exists(select * from A where A.id = B.id) ですと、約3hぐらいかかりました。 inで実行すると等価結合したときと変わらないぐらいになります。 こういう場合、皆さんはどう結合されていますか? お知恵を拝借できると幸いです。 ちなみにoracle 8iです。 よろしくお願いいたします。
- 締切済み
- Oracle
- 外部結合と等価結合のパフォーマンスの違いについて(ビューの場合)
Oracle10gでのSQL文の違いについて教えて下さい。 前回の質問は、ストアドプロシージャに記述 されていて、バッチとして動かしています。 と書きましたが、ビューの場合のパフォーマンスの違いは どうなるのでしょうか?ビューの場合も同じような現象です。 下記の2つのSQL文は外部結合ありと外部結合なしの違いだけで、 他は変わりありません。 外部結合ありのほうは 結果がすぐに返されるのですが、外部結合なしのほうは 結果が返ってこない、あるいはかなり時間がかかるという 現象が起きています。 SQL文は簡略して記述していますが、SELECT句には、 TO_CHAR()やSUM(CASE WHEN ...THEN ...ELSE...)が使用してあり 少し重くなる処理も含まれています。 この2つのSQL文でパフォーマンスに影響している原因は 何なんでしょうか?オプティマイザとか実行計画とかの 説明を読んだのですが、いまいちよく解りません。。 自分では中級者以下だと思っていますので、わかりやすく 説明して頂けたら助かります。宜しくお願い致します。 (外部結合ありのSQL) SELECT a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 FROM TBL_A a, TBL_B b WHERE a.項目1 = b.項目1(+) AND a.項目2 = b.項目2(+) AND a.項目3 = b.項目3(+) AND a.項目4 = b.項目4(+) AND GROUP BY a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 (外部結合なしのSQL) SELECT a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 FROM TBL_A a, TBL_B b WHERE a.項目1 = b.項目1 AND a.項目2 = b.項目2 AND a.項目3 = b.項目3 AND a.項目4 = b.項目4 AND GROUP BY a.項目1, a.項目2, a.項目3, a.項目4, a.項目5
- ベストアンサー
- Oracle
- 外部結合について
外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。
- ベストアンサー
- Oracle
- 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 ???? こんな感じでつまづいてしまいました・・・
- 締切済み
- その他(データベース)
- Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパ
Oracle10gで1つのSQLで複数回同じテーブルを結合する場合のパフォーマンス向上 Oracleで1つのSQL内で同じテーブルを2回以上結合すると結果出力にかかる時間が非常に遅くなります。 例: SELECT * FROM A, B b1, B b2 WHERE a.id = b1.id AND a.id = b2.id (テーブルBを2回結合している) こういう場合にパフォーマンスを落とさない方法はありますか?テンポラリテーブルでテーブルBのレプリカを作成して使用するというのはなしです。あくまで1つのSQLで結果出力できることを前提にパフォーマンスを向上する方法を教えてください。
- ベストアンサー
- Oracle
- オラクル 外部結合についての質問
下記のようなテーブルがある場合に Aテーブル Bテーブル 品目(主) 品目(主) 子品目(主)SEQ パン1 パン1 小麦粉 1 パン1 ジャム 2 パン1 バター 3 結合条件 A.品目 = B.品目 この時に1件のみ取得できるようにしたい。 Bテーブルから取得したいのは、SEQ3のデータ。 SELECT A.品目, B.子品目, SEQ FROM A,B WHERE A.品目 = B.品目(+) とすると、下記3行のデータが取れてしまう。 パン1 小麦粉 1 パン1 ジャム 2 パン1 バター 3 これを↓だけ取得したいのです。 パン1 バター 3 外部結合ではそもそも取得できないのでしょうか? どのようなSQLを書けばいいのか教えてください。
- ベストアンサー
- Oracle
- 外部結合
外部結合でどうしても理解できないパターンがあるので どなたか詳しい人がいたら教えてください。 ・まず、テーブルは下記のa_tblとb_tblの2テーブルです。 SQL> desc a_tbl; 名前 型 ------ --------------- A1 CHAR(4) A2 CHAR(4) A3 CHAR(1) SQL> desc b_tbl; 名前 型 ------ ----------- B1 CHAR(4) B2 CHAR(4) B3 CHAR(1) ・それぞれの内容は、 SQL> select * from a_tbl; A1 A2 A3 ---- ---- - 1001 A001 1 1002 A002 0 1003 A003 1 1004 A004 0 1005 A005 1 SQL> select * from b_tbl; B1 B2 B3 ---- ---- - 1001 B001 1 1002 B002 0 1003 B003 1 1004 B004 0 ・この2つのテーブルに対して、下記のselectを行います。 SQL> select * from a_tbl, b_tbl where b1(+)=a1 and b3(+)='1'; A1 A2 A3 B1 B2 B3 ---- ---- -- ---- ---- -- 1001 A001 1 1001 B001 1 1002 A002 0 1003 A003 1 1003 B003 1 1004 A004 0 1005 A005 1 ・私の予想では、下記の様になると思ったのですが、結果は 上記の様になります。 どのような考え方をすれば上記の結果になるのか教えてください。 A1 A2 A3 B1 B2 B3 ---- ---- -- ---- ---- -- 1001 A001 1 1001 B001 1 1003 A003 1 1003 B003 1
- ベストアンサー
- その他(データベース)
- オラクル結合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
- 外部結合について
こんばんは。 SQLでの外部結合について教えてください。(オラクルの場合です) データを取得しいテーブルが4つあったとします。 Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 取得したいデータは、全てのテーブルに存在しています。 Aテーブルに対してBテーブルとCテーブルを外部結合したいと思っています。 Aテーブルには「ユーザーID」があります。 Bテーブルからは、「給料」データが取得したいのです。 Cテーブルからは、「年齢」データが取得したいのです。 B,Cのテーブルに条件に合致するものがなくても、AのユーザーIDだけは 表示したいと思っています。 自分なりに考えて色々試したのですが、うまく行かず構文でエラーになります。 どうしてもAテーブルに外部結合したいです。 SELECT A.ユーザーID, B.給料, C.年齢 FROM A, B, C WHERE A.ユーザーID = ’XXXXX’, A.名前 = ’AAAAAA’, A.住所 = ’KKKKKKKKKKK’, A.名前(+) = B.名前, A.名前(+) = C.名前, A.郵便番号(+) = B.郵便番号, A.郵便番号(+) = C.郵便番号 このように考えたのですが,「すでに1つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。 ※全角になっているなどは、見やすくする為にやっています。
- ベストアンサー
- その他(データベース)
お礼
ありがとうございます。 レコード件数はAが数百~数千件、Bが十数件です。 どっちにしてもたいした件数ではないのですが。 > 「実測しましょう」というのが、最も間違いのない答えです。 それはそうなんですが、データの入手はまだ一ヶ月以上さきになるもので。 数千件のデータを手で入力したくないですし。 それで、どなたかご存知ないかなと。