哪一个最适合表现?
1)订单(数据库侧计算)
2)sort_by(Ruby方面计算)
根据我的想法sort_by
应该快order
。因为order
是从数据库端执行的,所以在获得结果后它在ruby端执行速度较慢且sort_by
,但是通过查看此结果我感到困惑。
=>普通查询(花费更多时间,然后order
和sort_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
。
哪一个是最好的:(
答案 0 :(得分:5)
数据库处理比Ruby更快。并且数据库处理可以很好地扩展,而Ruby的处理速度减慢与您正在处理的数据大小的增加成正比。
使用Ruby进行处理会大大增加时间和(特别是)内存消耗,并且很容易使内存过载而 永远不会实际完成 数据集“大”的处理”
使用Ruby进行1_000_000行的一些计算将需要 几十 秒,而PostgreSQL将在 强>秒。
答案 1 :(得分:1)
您的第一个假设应该始终是数据库中的数据操作将比Ruby快得多。
对于 small 问题子集,您可以选择不使用该数据库。
例如,如果您有一个包含多个子记录的记录,并且您必须根据各种条件读取多个子行(active = true,date&lt; today,transmit = false等),那么它可能会更快使用一个查询读取所有子记录,然后使用Ruby从该数据集中过滤掉您想要的那些记录。如果您正在使用预先加载,则尤其如此。
然而,这不应该是你的第一个假设。