Postgresqlのテーブルの結合についての質問です。


USERテーブルにはuser_idとuser_ageが入っています。(約40万レコード)
CLICKテーブルにはuser_idとclick_urlが入っています。(約200万レコード)

ユーザーがURLをクリックするごとにCLICKテーブルにuser_idとclick_urlをインサートしています。

user_age(ユーザーの年齢)が20の人がURLをクリックした総数を出そうとしているのですが、時間がかかりすぎてうまくいきません。
実行しているSQL文は以下のものなのですが、効率を良くする方法はありますか?

select count(*) from USER join CLICK on USER.user_id = CLICK.user_id where USER.user_age=20;

回答の条件
  • 1人3回まで
  • 登録:2006/04/04 11:34:03
  • 終了:2006/04/09 16:18:32

回答(5件)

id:kazz7 No.1

kazz7回答回数446ベストアンサー獲得回数142006/04/04 11:44:23

ポイント14pt

まずUSER表のuser_age列にインデックスを作ってみてはどうでしょうか?

create index user_age_ix on USER (user_age) ;

id:studio15

テーブルを結合せずにuser_ageが20のユーザーをUSERテーブルから抽出した場合は、ほとんどコストがかからないのですが、結合する場合はインデックスを張ったほうが良いのでしょうか?

2006/04/04 11:54:58
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/04/04 11:47:49

ポイント14pt

select count(*) from USER ,CLICK

Where USER.user_id = CLICK.user_id and USER.user_age=20;

だと遅いのでしょうか?

遅すぎるならば、インデックスをはるなり、工夫しないとダメですね。

id:studio15

>だと遅いのでしょうか?

遅いです。

ただ、上と同じく結合する場合にはuser_ageにもインデックスを張ったほうが良いのでしょうか?

2006/04/04 11:57:18
id:tadashi0805 No.3

tadashi0805回答回数287ベストアンサー獲得回数292006/04/04 11:54:21

ポイント14pt

少なくとも、両テーブルのuser_idと、USERのuser_ageにindexがないと、とても遅いと思いますが、indexの状況はどんな感じなのでしょうか?

id:studio15

インデックスはuser_idのみに張られています。

ただ、抽出部分の処理で時間がかかっているというより、結合部分の処理で時間がかかっているような気がします。

2006/04/04 12:05:30
id:llusall No.4

llusall回答回数505ベストアンサー獲得回数612006/04/04 16:46:21

ポイント44pt

>出部分の処理で時間がかかっているというより、結合部分の処理で時間がかかっているような気が

とのことですので、抽出したUSERテーブルに対して、CLICKテーブルを結合というのは駄目でしょうか?

Postgresqlを知らないのと、

実際に試行して見たわけではないので恐縮ですが、次の様なイメージではどうでしょうか?

select count(*) from

(

select user_id

from USER

where USER.user_age=20

) U join CLICK C on U.user_id = C.user_id

id:studio15

これで行けそうですね。ありがとうございます!

2006/04/05 22:41:12
id:karla No.5

karla回答回数130ベストアンサー獲得回数42006/04/04 19:44:51

ポイント14pt

select count(*) from CLICK c,(select user_id from USER where user_age=20) u where c.user_id=u.user_id;

全体を結合した後に20歳の人を抽出するのではなく、20歳の人を抽出してCLICKと結合したほうが速度が早くなります。

user_ageにインデックスを張るのはデータのばらつきが少ないと効果がないかもしれません。

上記のSQLの先頭に explain を付加して実行すると実行計画が表示されますので、それをここに乗せるとピンポイントなアドバイスが出てくると思いますよ。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません