- PR -

UNION前の結合とUNION後の結合について

1
投稿者投稿内容
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2005-04-26 11:01
こんにちはWataです。
こちらの会議室には初めての投稿になります。

ある二つのテーブルA, BをUNION ALLでマージした表から
サブクエリと結合して条件に当てはまるレコードを抽出したい場合、
次の2通りの方法でパフォーマンス的な違いは発生するものでしょうか?

コード:
--1. UNIONする前に結合
select a, b, c
from (
    select A.a as a, A.b as b, null as c
    from A, (select ... ) C
    where A.a = C.a
  union all
    select B.a as a, B.b as b, B.c as c
    from B, (select ... ) C
    where B.a = C.a
) order by a, b, c nulls first

--2.UNION後に結合
select AB.a, AB.b, AB.c
from (
    select A.a as a, A.b as b, null as c
    from A
  union all
    select B.a as a, B.b as b, B.c as c
    from B
) AB, (select ... ) C
where AB.a = C.a
order by a, b, c nulls first


なお、実際にUnionするテーブルの数は4つで、
結構大きなサイズになる見込みです。


自分の考えとしては
1の方法だとサブクエリの評価が2度行なわれそな気がするのと、
SQL文が2の方法よりも巨大化してしまうのが嫌な感じで、

2の方法だとUNION後の巨大なテーブルと結合を行なうので
その影響が心配です。
(組み合わせの総数は変らないけど...)

■環境
Oracle8i
Solaris8
JDBCでアクセス
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-04-26 11:16
今日は。

引用:

次の2通りの方法でパフォーマンス的な違いは発生するものでしょうか?


SQL Analyseにかけてみてはどうでしょう? 
_________________
Inspired Ambitious
ISMS Assistant Auditor
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-04-26 11:30
引用:

Wataさんの書き込み (2005-04-26 11:01) より:

コード:

--1. UNIONする前に結合
select a, b, c
from (
select A.a as a, A.b as b, null as c
from A, (select ... ) C
where A.a = C.a
union all
select B.a as a, B.b as b, B.c as c
from B, (select ... ) C
where B.a = C.a
) order by a, b, c nulls first

--2.UNION後に結合
select AB.a, AB.b, AB.c
from (
select A.a as a, A.b as b, null as c
from A
union all
select B.a as a, B.b as b, B.c as c
from B
) AB, (select ... ) C
where AB.a = C.a
order by a, b, c nulls first


なお、実際にUnionするテーブルの数は4つで、
結構大きなサイズになる見込みです。



Oracle8iには詳しくないですが・・・
A.a = C.aや
B.a = C.aでどれぐらいのレコードが絞れるかによって性能差が出ると思います。

クエリが重複しているとかのプリペアで性能差がはっきり出たという経験は
私にはないですね。
やはり、ディスクアクセスとメモリ使用量で性能に差が出たことが多いです。

#---投稿後、不要引用削除+文追加

[ メッセージ編集済み 編集者: 夏椰(かや) 編集日時 2005-04-26 11:47 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2005-04-26 12:38
素早い回答ありがとうございます。

引用:

夏椰(かや)さんの書き込み (2005-04-26 11:30) より:
クエリが重複しているとかのプリペアで性能差がはっきり出たという経験は
私にはないですね。
やはり、ディスクアクセスとメモリ使用量で性能に差が出たことが多いです。


やはり、先に間引いといた方がよさそうですね。

引用:

NAOさんの書き込み (2005-04-26 11:16) より:
SQL Analyseにかけてみてはどうでしょう? 


こちらも試して見たいと思います。
(と言いつつSQL Analyseって何?とぐぐってる際中)
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-04-26 12:41
まず、Oracleであれば、plan_tableを作成してexplain planを実行し、実行計画を取得してみてください。

また、検索速度についてはルールベースかコストベースかや、統計情報を取得しているか否かによっても異なるため、一概にどちらがよいとは言えませんが、ルールベースのアプローチを取られている場合、前者の方が圧倒的に有利になる可能性があるでしょう。

ところで、1のSQLはカッコ内の内容+ORDER BY句だけでも同じ結果になったように思うのですが。
1

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