こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ビュー(インラインビュー)で集約した結果と結合するSQLについて

テーブルAを複数のキー項目で集約した結果と、テーブルBを結合しようとしています。
インラインビュー(もしくはビュー)で予め集約を行う、以下のようなSQLを考えました。

候補<1> MAX関数でTableA.列1を絞る

select ...
from (select max(列1),列2,列3,列4 from TableA group by 列2,列3,列4) TableA2,Table_B
where TableA.列2=TableB.列2
and ...;

候補<2> ROW_NUMBER関数で列1の順位を取得し、Where句で順位=1とすることでTableA.列1を絞る

select ...
from (select 列2,列3,列4 from TableA group by 列2,列3,列4
row_number() over (partition by 列2,列3,列4 order by 列1) RN) TableA2,Table_B
where TableA.列2=TableB.列2
and ...
and RN=1;

※候補<1><2>で結果が異なることがありますが、ともかく
「インラインビュー(もしくはビュー)で予め集約を行う」がやりたいことです。

しかしこのようなクエリだと、インラインビューでもビューでも、
性能がでません。実行計画を確認したところ、TableA,TableBの結合で生成される
レコードごとに毎回集約を行っているようで、膨大なクエリ数が発生していました。

ビューやインラインビューで上記のように集約を行うと危険、とはよく聞きますが...
ビューやインラインビューで集約した結果をひとつのテーブルとみなして結合するなど、
レコードごとに集約を行わないようなノウハウがありましたら、お教え願います。

投稿日時 - 2006-04-27 00:30:15

QNo.2116525

困ってます

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

select /*+ ORDERED */ *
FROM
(select * from (select X.*,row_number() ~ from TableA x) where R=1) A,
Table B
where A.列2=B.列2
;

結合順を明確化し、レコードの選択を分離すれば、ねらい通りの順番で
動くのじゃないとか思いますが..
使っているオプティマイザ次第なので..

投稿日時 - 2006-04-27 02:01:12

お礼

ご回答ありがとうございます。そんな方法があるのですね。参考になります。
ただ、使用している製品(SQLを生成して発行するツール)の仕様や環境等の都合上、HINTを使用できないので、「/*+ ORDERED */」は使用できません...。
いっそのこと、集約テーブル(上記例ではTableA)をあらかじめデータマートとして作成しておこうかと考えています。
最初の説明が不足しておりまして、申し訳ありません。
ありがとうございました。

投稿日時 - 2006-04-27 20:59:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問