Rails:使用组计算进行缩放

时间:2009-10-15 11:44:18

标签: ruby-on-rails activerecord scalability

目前我正在运行类似于此命令的内容:

Person.sum(:cholesterol, :group => :age)

当我有少量记录时,这似乎很有用。但是,当我尝试在表中使用几千条或更多条记录来调用它时,运行起来需要几分钟。但是,SQL查询:

SELECT sum(`people`.cholesterol) AS sum_cholesterol, age AS age 
FROM `people` 
GROUP BY age

在相同的千条记录上大约需要0.02秒。一旦我掌握了数据,我就不需要做太多的事情了。有更有效的方法吗?我知道我可以手动从模型和控制器进行SQL查询,我不知道这是否是一个可行的选项,因为我没有找到一个明确的方法来处理查询后的结果。

3 个答案:

答案 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找到的更快。