目前我正在运行类似于此命令的内容:
Person.sum(:cholesterol, :group => :age)
当我有少量记录时,这似乎很有用。但是,当我尝试在表中使用几千条或更多条记录来调用它时,运行起来需要几分钟。但是,SQL查询:
SELECT sum(`people`.cholesterol) AS sum_cholesterol, age AS age
FROM `people`
GROUP BY age
在相同的千条记录上大约需要0.02秒。一旦我掌握了数据,我就不需要做太多的事情了。有更有效的方法吗?我知道我可以手动从模型和控制器进行SQL查询,我不知道这是否是一个可行的选项,因为我没有找到一个明确的方法来处理查询后的结果。
答案 0 :(得分:2)
可能发生的事情是Rails实例化每行请求或使用的总和,或保留内存信息以帮助计算。
尝试使用find_by_sql方法,例如:
Person.find_by_sql("SELECT sum(`people`.cholesterol) AS sum_cholesterol, age AS age FROM `people` GROUP BY age")
看看它需要多少。
另外,检查您的日志。他们为您提供了大量有关渲染时间的信息。
答案 1 :(得分:1)
你是如何运行你的应用程序的?
日志可以为您提供很好的信息,对于mongrel,在开发模式下,如果您分离了杂项,您将看到您的应用直接在终端或日志文件中执行的SQL查询。
也许rails没有进行您期望的查询?
您也可以使用Yaraher建议的解决方案。
find_by_sql将直接执行请求,返回一个Ruby对象,并准备好使用getter方法
result = person.find_by_sql("SELECT sum(`people`.cholesterol) AS sum_cholesterol, age AS age FROM `people` GROUP BY age")
p result.sum_cholesterol
答案 2 :(得分:1)
您也可以尝试:
Person.find(:all, :select => "sum(cholestorol) as 'sum_cholesterol'", :group => "age")
它可能有点清洁,但我不知道它是否比sql找到的更快。