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

締切り済みの質問

巨大テーブルの外部結合

巨大なテーブル同士を結合する際に、みなさんはどのように結合されますか?もっともパフォーマンスのある方法を模索しているところです。

テーブル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です。
よろしくお願いいたします。

投稿日時 - 2006-09-21 11:59:01

QNo.2421434

すぐに回答ほしいです

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

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

回答(2)

ANo.2

件数を取るためのViewを作ってみては?
基がそれだけの件数だとレスポンスは遅いとは思いますが、カウントのSelect文を投げるよりはましになるんじゃないかと...
推測の域を出ていません。ごめんなさい。

投稿日時 - 2006-09-22 13:50:13

ANo.1

Bテーブルの B.id にインデックスを作成することはできませんか?
Bテーブルにインデックスを作成すれば, もっと効率良く実行できるはずです。

このままですと, どうやって頑張って SQL を書いても Bテーブル全件(400万件) を検索する時間がかかってしまうため,
マシンスペックにもよりますが, それ相応の時間がかかってしまいます。

投稿日時 - 2006-09-21 13:51:35

お礼

ありがとうございます。
実はインデックスはなくはないのですが、
複合インデックスですので、結局この結合SQLには
インデックスとして利用されていません。

インデックスを作成しないである程度のパフォーマンスを出したいと思ったのですが、やはり時間はかかりそうですよね。

ご意見ありがとうございます。

投稿日時 - 2006-09-21 14:02:08

あなたにオススメの質問