预先加载生成的查询速度慢

我优化我的应用程序,发现一些有趣的事情。 我本来这句话在我的控制器

@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"

这是不是进行分页有关? 难道是两者的结合?

--------------解决方案-------------

是的,该查询似乎是由分页插件生成。 这个查询是必要的估计的总页数。

但如果你知道的记录数反正(做一个简单的SELECT COUNT(*) FROM "votes"之前),你可以通过这个数字在以will_paginate :total_entries选择!

(见WillPaginate ::查找:: ClassMethods获取更多信息。)

顺便说一句,你有没有创建一个索引votes.user_id ? 可能是正在放缓的查询。 我想知道,为什么DISTINCT条款应占用这么多的时间, id可能已经有一个独特的约束(如果没有,请尝试添加一个)。

分类:Ruby on Rails的 时间:2015-03-15 人气:3
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.505 (s). 10 q(s)