2017-01-24 21 views
0

私は、Webappを訪れてユーザーの平均セッションを計算しています。 ページの訪問ごとに、私のデータベースに訪問記録が作成されます。Railsの平均セッション数の計算

10000個の個別トークンを持つ〜40000個のビスタがあるので、私の計算には非常に時間がかかります。 誰かが平均セッションの計算速度を上げるように考えましたか?

私はuniqeトークンを収集しています。そして、最初と最後の訪問のトークンごとに、その差を計算します。

diff = 0 
token = self.visits.where(created_at: self.statistic_range).pluck(:token).uniq 

token.each do |tok| 
    visits = self.visits.where(created_at: self.statistic_range, token: tok).order('updated_at asc') 
    diff += (visits.last.created_at - visits.first.created_at).round 
end 
return diff/token.size 

答えて

0

ここでn + 1のクエリの問題があります。あなたのコードは10,000 + 1個の個別SQLクエリを実行しています。

すべての訪問を一度取得して、配列に格納してから計算を行うのはなぜでしょうか。

visits = self.visits.where(created_at: self.statistic_range).to_a 
token = visits.pluck(:token).uniq 
... 

これは明らかに多くのRAMとCPUを消費しますが、ほとんどの場合、10,001個のSQLクエリを実行するほど悪くはありません。