人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;

●質問者: studio15
●カテゴリ:ウェブ制作
✍キーワード:Click ON postgreSQL SELECT SQL
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● kazz7
●14ポイント

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

create index user_age_ix on USER (user_age) ;

◎質問者からの返答

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


2 ● きゃづみぃ
●14ポイント

select count(*) from USER ,CLICK

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

だと遅いのでしょうか?

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

◎質問者からの返答

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

遅いです。

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


3 ● tadashi0805
●14ポイント

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

◎質問者からの返答

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

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


4 ● llusall
●44ポイント

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

とのことですので、抽出した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

◎質問者からの返答

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


5 ● karla
●14ポイント

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 を付加して実行すると実行計画が表示されますので、それをここに乗せるとピンポイントなアドバイスが出てくると思いますよ。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ