【问题标题】:Rails: scaling with group calculationsRails:使用组计算进行缩放
【发布时间】:2010-12-07 00:15:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 好吧,如果这不是那个需要这么多时间的 SQL 查询,那它一定是别的东西。查看您的日志以查看是否没有任何其他可能太长(或太多 sql 查询)的 sql 查询。
  • 谢谢,是查询比较费时间。当我在 mysql 环境中运行命令时,它几乎是通过 rails 调用它时的 1000 倍。 Rails 真的有可能在这种方法上这么慢吗?我只对这一种方法有疑问。

标签: ruby-on-rails activerecord scalability


【解决方案1】:

可能发生的情况是 Rails 为求和的每行实例化一个对象,或者在内存中保存信息以帮助计算。

尝试使用 find_by_sql 方法,例如:

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

然后看看需要多少。

另外,请检查您的日志。他们为您提供了大量关于渲染时间长的信息。

【讨论】:

  • 是的,正如我之前在查看日志时提到的,它正在运行预期的 SQL 查询“SELECT sum(...”,这是我在运行命令时看到的唯一情况。您的解决方案是我一直在寻找的,运行时间与在 MySQL 环境中运行它几乎相同。我仍然不知道为什么 Rails 方法在最终调用完全相同的 SQL 时需要这么长时间。
【解决方案2】:

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

日志可以为您提供大量信息,并且使用 mongrel,在开发模式下,如果您分离了 mongrel,您将直接在终端或日志文件中看到您的应用正在执行的 sql 查询。

也许 rails 没有执行您期望的查询?

您也可以使用 Yaraher 建议的解决方案。

find_by_sql 将直接执行请求并返回一个带有可供使用的 getter 方法的 Ruby 对象

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

p result.sum_cholesterol

【讨论】:

    【解决方案3】:

    你也可以试试:

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

    可能会干净一些,但不知道会不会比通过sql查找快。

    【讨论】:

    • 这个解决方案也比 Person.sum(:cholesterol, :group => :age) 快得多
    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2021-01-24
    • 2013-11-08
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多