哪一个最适合来自' order'和' sort_by'?

时间:2016-10-18 10:02:26

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord

哪一个最适合表现?

1)订单(数据库侧计算)

2)sort_by(Ruby方面计算)

根据我的想法sort_by应该快order。因为order是从数据库端执行的,所以在获得结果后它在ruby端执行速度较慢且sort_by,但是通过查看此结果我感到困惑。

=>普通查询(花费更多时间,然后ordersort_by查询): -

> User.all
SELECT "users".* FROM "users"
#<Benchmark::Tms:0x000000089e4398 @cstime=0.0, @cutime=0.0, @label="", @real=6.515499990200624e-05, @stime=0.0, @total=0.0, @utime=0.0>

=&GT;使用基准的order查询(比普通查询和sort_by查询花费更少的时间): -

> User.order(:name)  # `order` query is perform in sql so should take more time
User Load (0.6ms)  SELECT "users".* FROM "users"   ORDER BY "users"."name" ASC
#<Benchmark::Tms:0x00000007ec48c8 @cstime=0.0, @cutime=0.0, @label="", @real=0.00014305600052466616, @stime=0.0, @total=0.0, @utime=0.0>

=&GT;使用sort_by和基准进行查询(比order查询更多,比普通查询更少的时间): -

> User.all.sort_by(&:name) # Not perform `order` from database side so should be faster then `order`
SELECT "users".* FROM "users"
#<Benchmark::Tms:0x0000000897e5c0 @cstime=0.0, @cutime=0.0, @label="", @real=0.0019228710007155314, @stime=0.0, @total=0.0, @utime=0.0>

结论: -

正常查询实时: - 6.515499990200624e-05

order查询实时: - 0.00014305600052466616

sort_by查询实时: - 0.0019228710007155314

从这个结论我们可以说: -

正常查询需要花费太多时间,然后应用order查询。

我们必须使用order方法来减少查询执行时间吗?

根据我的想法,我总是更喜欢sort_by

哪一个是最好的:(

2 个答案:

答案 0 :(得分:5)

数据库处理比Ruby更快。并且数据库处理可以很好地扩展,而Ruby的处理速度减慢与您正在处理的数据大小的增加成正比。

使用Ruby进行处理会大大增加时间和(特别是)内存消耗,并且很容易使内存过载而 永远不会实际完成 数据集“大”的处理”

使用Ruby进行1_000_000行的一些计算将需要 几十 秒,而PostgreSQL将在 强>秒。

答案 1 :(得分:1)

您的第一个假设应该始终是数据库中的数据操作将比Ruby快得多。

对于 small 问题子集,您可以选择不使用该数据库。

例如,如果您有一个包含多个子记录的记录,并且您必须根据各种条件读取多个子行(active = true,date&lt; today,transmit = false等),那么它可能会更快使用一个查询读取所有子记录,然后使用Ruby从该数据集中过滤掉您想要的那些记录。如果您正在使用预先加载,则尤其如此。

然而,这不应该是你的第一个假设。