2009-10-15 82 views
0

类似这样的命令,目前我正在运行的东西:Rails的:与组计算比例

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

那么,如果这不是那个花费那么多时间的SQL查询,它肯定是别的。看看你的日志,看看是否没有其他的sql查询可能太长(或太多的sql查询)。 – 2009-10-15 11:49:41

+0

谢谢,这是花时间的查询。当我在mysql环境下运行命令时,它的速度几乎是通过rails调用时的1000倍。这种方法的轨道是否真的很慢?我只有这个方法的问题。 – Evan 2009-10-15 12:37:37

回答

2

可能它正在发生的事情是,Rails正在实例化一个请求或使用的对象的每一行,或保存在内存中的信息来帮助计算。

尝试使用的find_by_sql方法是这样的:

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

,看看它有多少花费。

此外,请检查您的日志。他们给了你很多关于在哪里拍摄这么长时间的信息。

+0

是的,正如我前面提到的看着我的日志,它正在运行预期的SQL查询“SELECT sum(...”这是我看到的,当我运行命令时发生的唯一的事情 您的解决方案是我寻找,运行时间与在MySQL环境中运行时间几乎相同 我仍然不知道为什么Rails方法在调用完全相同的SQL时花费了很长时间 – Evan 2009-10-22 05:58:46

1

你是如何运行你的应用程序?

日志可以给你很好的信息和杂种,在开发模式下,你会看到你的应用程序直接在终端或你的日志文件中执行的SQL查询,如果你分离杂种。

也许钢轨没有做你期待的查询?

您也可以使用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 
1

的回报,你也可以尝试:

Person.find(:all, :select => "sum(cholestorol) as 'sum_cholesterol'", :group => "age") 

它可能是一个有点清洁,但我不知道它是否会比通过sql查找更快。

+0

该解决方案也很多快于Person.sum(:胆固醇,:组=>:年龄) – Evan 2009-10-22 08:31:37