对同一组数据进行多次计算:ruby还是数据库?

时间:2010-12-25 18:14:18

标签: ruby-on-rails ruby performance

我有一个模型Transaction,我需要为transactions的子集显示许多字段上的许多计算结果。

我已经看到了两种方法,但我不确定哪种方法最好。当数据集增长和并发用户数量增加时,我会追求性能影响最小的那个。

data[:total_before] = Transaction.where(xxx).sum(:amount_before)
data[:total_after] = Transaction.where(xxx).sum(:amount_after)
...

transactions = Transaction.where(xxx)
data[:total_before]= transactions.inject(0) {|s, e| s + e.amount_before }
data[:total_after]= transactions.inject(0) {|s, e| s + e.amount_after }
...

编辑:where子句始终相同。

我应该选择哪一个? (还是有第三种,更好的方法?)

谢谢,P。

2 个答案:

答案 0 :(得分:4)

不要唠叨,但是呢

transactions = Transaction.where(xxx)
data[:total_before] = transactions.sum(:amount_before)
data[:total_after] = transactions.sum(:amount_before)

?这看起来像方法1和2的优势联合:)您重用搜索结果并使用更干净的特定于rails的sum聚合器。

PS如果您在询问是否可以依赖Rails来缓存Transaction.where(xxx)查询的结果,我不知道。而当我不知道时,我更喜欢安全地玩。

答案 1 :(得分:4)

你真的在谈论可扩展性。

如果您正在谈论数百万行并且需要对它们进行计算,那么您认为哪个更快?

  1. 要求DBM汇总数百万行并返回两个数字。
  2. 通过网络返回数百万个您迭代两次的查询结果。
  3. 在第一种情况下,您可以使用更快的CPU,更多RAM,更快的驱动器或定期预先计算您的值来扩展数据库主机。您想要在DBM中完成的计算正是它所写的事情。

    在第二种情况下,您必须扩展计算主机,可能是连接DBM和计算主机的交换机,也可能是数据库主机,因为它必须检索并推送数据。想象一下,当它处理数据时对网络的影响,以及它在执行所有操作时对计算主机CPU的影响。

    我会做第一个,因为它对我来说似乎更具可扩展性。