Rails5.1.1包含+ map功能将极慢15秒左右

时间:2018-01-17 18:18:12

标签: sql ruby-on-rails ruby performance

如果用户模型包含多个表并使用地图,它会真的慢! 它可能是大约11s~20s。

在控制台中我看了日志打印,当sql包含时它总是很慢,打印出来后sql查询日志完成后它会很快运行。

此功能仅用于将数据导出为ex​​cel,因此很少使用导致我不想在这种情况下使用计数器缓存。

Benchmark.bm do |x| 
   x.report { 
     User.includes(:active_goal, :notification_setting, :reviews, 
     :comments, :answers, :quiz_answers).map(&:id) do |user|
        [
          user.active_goal.try(:name),
          user.notification_setting&.is_need_notify || false,
          user.reviews.size,
          user.comments.size,
          assignment_reviews(user.answers),
          right_ratio(user.quiz_answers)
        ]
      end
   }

   x.report { 
     User.includes(:active_goal, :notification_setting, :reviews, 
     :comments, :answers, :quiz_answers) 
    }
end

Benchmark::Tms: @real=14.244344999955501, @stime=0.45999999999999996, @total=13.05, @utime=12.59
Benchmark::Tms: @real=0.00010500004282221198, @stime=0.0, @total=0.0, @utime=0.0

@users.size = 887
QuizAnswer.all.size = 71386   
Goal.all.size = 1519    
NotificationSetting.all.size = 928    
Review.all.size = 10
Comment.all.size = 6664
Answer.all.size = 98

Ruby 2.4.1p111

顺便说一句,这些表我已经在id上做了索引。

仍然不知道它是什么问题。

有人可以帮助我或分享我如何加快速度?

1 个答案:

答案 0 :(得分:-1)

使用.pluck(:id)代替.map(&:id) 这会更快。