提高数据重站点效率的想法

时间:2011-01-27 06:35:53

标签: ruby-on-rails ruby data-structures

我正在为客户工作一个网站,并且我正在努力提高我们的销售数据。我的原始解决方案变成了意大利面的混乱的自定义SQL查询,感觉为什么太hack-y。接下来我尝试编写一个包装类(SalesCalculator),它将下拉所有相关的销售记录并尝试在Ruby中处理它们,但当我们谈论30,000多条记录时,它会严重损害性能,甚至缓存也会可能很烦人(我们正在谈论> 10s页面加载)。

我还尝试过为eac构建查询

我想我的总体目标是简化与数据的交互,以便保持一致的界面。以下是我在任何给定页面上通常会做的一些事情:

  • 3年期间每年的销售总收入
  • 与上述相同,但分为5个左右的部门
  • 部门/员工(当前和上一年)按月的总收入

所以我的问题是你们有什么建议/例子可以用大型数据集做类似的事情吗?

4 个答案:

答案 0 :(得分:3)

30k什么都没有。甚至对于SQLite数据库也是如此。

你的问题是:30,000多个AR对象至少重复15次 - 不要这样做。这是一个坏主意和糟糕的设计,从各个角度来看都很糟糕。

您的表中已有日期字段,为什么不使用WHERE YEAR(date)= 2011?您可以将department列添加到数据库中。您可以在某些字段上添加索引以提高查询性能。你可以做很多事情来缩小搜索范围,只有你真正需要的AR对象。

将整个数据库下载到30k AR对象中是你想要做的最后一件事,我无法想象需要这样的解决方案会出现什么问题。

答案 1 :(得分:3)

听起来您正在使用数据库作为文件系统,并使用Ruby via Rails来完成构建报告的繁重工作 - 我将重新使用SQL。

根据需要测试您的查询和添加索引,您应该能够立即缩短页面加载时间。

答案 2 :(得分:0)

您必须让数据库进行计算。它比计算ruby中的总数要快许多倍。确保你有必要的索引。

在rails中执行本机查询:

class Sales

  # Other code

  def self.totals (group_by, where, ...)
    # Build the query depending of the parameters
    sql = "SELECT SUM(amount) FROM sales ... " 
    # Execute the query
    result = connection.execute(sql) 
    # when using mysql result will be a Mysql::Result object
    # Finally you can wrap the totals in a nice hash
    data = {}
    result.each_hash do |row|
      data[row['col']] = row['other_col']
    end
    data
  end

这允许通过调用Sales.totals(..)进行查询。

如果您想从其他课程进行查询,请使用Sales.connection.execute(sql)

Mysql api:http://www.tmtm.org/en/mysql/ruby/

答案 3 :(得分:0)

named_scope的组合可能是您可以通过描述如何过滤数据的参数来提供它们的方式(让数据库完成繁重的工作)。

如果无法做到这一点,总会有find_each(:batch => 1000)一次抓取1000条记录。

相关问题