- PR -

SQLにおける表の結合について

1
投稿者投稿内容
佐々木
会議室デビュー日: 2005/10/18
投稿数: 11
投稿日時: 2008-09-12 15:06
お世話になります、佐々木と申します。
件名についてご相談です。
環境はOracle9iを使用しております。

下記のようなテーブルがあったとします。
(レーコード数はそれぞれ5万件程あると仮定します。)

テーブルA
--------------------------------------------
|name |course |score |
|------------------------------------------|
|SASAKI |SUGAKU |10 |
|SATOU |KOKUGO |50 |
|INOUE |EIGO |80 |
|OKAJIMA |EIGO |99 |
|SASAKI |KOKUGO |80 |
|SASAKI |EIGO |30 |
--------------------------------------------

テーブルB
--------------------------------------------
|name |course |score |
|------------------------------------------|
|SASAKI |SUGAKU |20 |
|SATOU |KOKUGO |60 |
|HUKUDA |RIKA |70 |
|OKAJIMA |SYAKAI |50 |
|SASAKI |KOKUGO |10 |
|MUTOU |EIGO |60 |
--------------------------------------------

これらの表を結合して、下記のように表示したいと思います。

テーブルA + テーブルB
--------------------------------------------
|name |course |score |
|------------------------------------------|
|SASAKI |SUGAKU |30 |
|SATOU |KOKUGO |110 |
|HUKUDA |RIKA |70 |
|INOUE |EIGO |80 |
|OKAJIMA |EIGO |99 |
|OKAJIMA |SYAKAI |50 |
|SASAKI |KOKUGO |90 |
|MUTOU |EIGO |60 |
|SASAKI |EIGO |30 |
--------------------------------------------

このような状況の場合に、
一番パフォーマンスが出るようなSQLはどの様にするのが
宜しいでしょうか。
「not in」等を使用しようと思いましたが、
件数が数万件となるとレスポンスがなくなってしまいました。

以上、なにかご教授頂けると幸いです。
よろしくお願いいたします。

[ メッセージ編集済み 編集者: 佐々木 編集日時 2008-09-12 15:07 ]
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-09-12 15:12
not inでどうやっているのでしょうか?
UNION ALLしたあとにnameとcourseでGROUP BYしてSUM(score)でどうですか?

こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-09-12 16:04
name,courseで主キーなら等価結合。
主キーでないならよっしーさんの方法。
もしかしたらSUMしてからUNION ALLでもSUMする手順の方が速いかも。
あとは、マテリアライズドビューの使用を検討するとか。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-09-12 18:08
FULL OUTER JOINでAとBを結合し A.score + B.score

という手も・・・。

どれが早いかは、それぞれ計測してみないと判りませんね。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-09-12 20:39
FULL OUTER JOINって、頭が混乱することが多くてあまり好きじゃないんですよね。でも、主キーならこの方が速いのでしょうね。

引用:

こあらさんの書き込み (2008-09-12 16:04) より:
SUMしてからUNION ALLでもSUMする手順の方が速いかも。


SUMしてからUNION ALLだと、テーブルA、B両方にある項目が別れてしまいます。
...違う意味かな?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-09-12 22:11
いいも悪いも実行計画を取得しましょう
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-09-12 22:22
引用:

よっしーさんの書き込み (2008-09-12 20:39) より:
引用:

こあらさんの書き込み (2008-09-12 16:04) より:
SUMしてからUNION ALLでもSUMする手順の方が速いかも。


SUMしてからUNION ALLだと、テーブルA、B両方にある項目が別れてしまいます。
...違う意味かな?



すみません。分かりづらかったですね。

コード:
select key,sum(score) from
(select key,sum(score) from a group by key
 union all
 select key,sum(score) from b group by key)
group by key



SUMした結果をUNION ALLして、さらにSUMする、という意味です。
1

スキルアップ/キャリアアップ(JOB@IT)