- - PR -
SQLにおける表の結合について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2008-09-12 15:12
not inでどうやっているのでしょうか?
UNION ALLしたあとにnameとcourseでGROUP BYしてSUM(score)でどうですか? | ||||||||||||
|
投稿日時: 2008-09-12 16:04
name,courseで主キーなら等価結合。
主キーでないならよっしーさんの方法。 もしかしたらSUMしてからUNION ALLでもSUMする手順の方が速いかも。 あとは、マテリアライズドビューの使用を検討するとか。 | ||||||||||||
|
投稿日時: 2008-09-12 18:08
FULL OUTER JOINでAとBを結合し A.score + B.score
という手も・・・。 どれが早いかは、それぞれ計測してみないと判りませんね。 | ||||||||||||
|
投稿日時: 2008-09-12 20:39
FULL OUTER JOINって、頭が混乱することが多くてあまり好きじゃないんですよね。でも、主キーならこの方が速いのでしょうね。
SUMしてからUNION ALLだと、テーブルA、B両方にある項目が別れてしまいます。 ...違う意味かな? | ||||||||||||
|
投稿日時: 2008-09-12 22:11
いいも悪いも実行計画を取得しましょう
| ||||||||||||
|
投稿日時: 2008-09-12 22:22
すみません。分かりづらかったですね。
SUMした結果をUNION ALLして、さらにSUMする、という意味です。 |
1