【发布时间】:2011-07-20 03:40:48
【问题描述】:
我正在优化我的应用程序并注意到一些有趣的事情。我最初在我的控制器中有这个语句
@votes = Vote.paginate(:page => params[:page], :order=>"created_at DESC")
这在我看来
<% @votes.each do |vote| %>
<tr>
<td><%= vote.user.display_name %></td>
...
我尝试将控制器更改为使用预加载:
@votes = Vote.includes(:user).paginate(:page => params[:page],
:order=>"created_at DESC")
这样做时,我注意到加载投票/索引的 ActiveRecord 查询时间从 180 毫秒增加到 440 毫秒。通过预先加载成功地减少了查询的数量。但是,我发现这是一个在急切负载情况下的耗时查询仅:
SQL (306.5ms) SELECT COUNT(DISTINCT "votes"."id") FROM "votes" LEFT OUTER JOIN "users" ON "users"."id" = "votes"."user_id"
为什么我的代码要求对左外连接进行计数?它在非急切负载情况下不存在。在非急切负载情况下,这是我能找到的最接近的语句:
SQL (30.5ms) SELECT COUNT(*) FROM "votes"
这与分页有关吗?是两者的结合吗?
【问题讨论】:
-
我今天也遇到了这个问题。我正在对一个 habtm 关联进行包含,它最终生成了一个包含模型的每个唯一 ID 的查询。这是all that i found on the issue
-
如果您将此作为答案发布,您将获得我的赞誉积分 =P 我认为您的问题将通过以下 Malte 的解决方案得到解决
标签: ruby-on-rails activerecord eager-loading will-paginate