如果需要进一步过滤,对于Active Record查找,查询中的'or'是否更快?

问题描述 投票:1回答:1

哪个查询更快?在第一个示例中,我对DB进行了2次调用。

在第二个示例中,我对DB进行了1次调用,但随后我需要进一步优化该数据以获取总计。

made  = SingleBet.where(maker_id: @current_user.id, taker_id: user.id, status: 'accepted')

taken = SingleBet.where(taker_id: @current_user.id, maker_id: user.id, status: 'accepted')

@total = made.pluck(:amount).sum + taken.pluck(:taker_amount).sum

vs

made_and_taken = SingleBet.where(maker_id: @current_user.id, taker_id: user.id, status: 'accepted').or(SingleBet.where(taker_id: @current_user.id, maker_id: user.id, status: 'accepted'))

@total = made_and_taken.where(maker_id: @current_user.id).pluck(:amount).sum + made_and_taken.where(taker_id: @current_user.id).pluck(:taker_amount).sum

[您注意到,在第二个示例中,在计算@total时,我需要使用where子句。我认为第二个示例更快,因为'where'子句不会传递给数据库?

谢谢!

ruby-on-rails activerecord ruby-on-rails-5
1个回答
0
投票

1]在两种情况下,您都进行2个数据库查询,只有第二种方法很难看,没有任何意义。您应该在控制台中检查发送了哪些SQL查询并了解发生了什么。

2)将relation.pluck(:amount).sum更改为relation.sum(:amount)。它将更快。

3)第一种方法看起来不错,但是您可以使用1个DB调用来执行该计算,但这需要编写一些原始SQL。解决方案可能取决于您使用的数据库类型(MySQL?PostgreSQL?等)。

结果SQL将如下所示:

SELECT SUM(
  CASE 
    WHEN maker_id = {{@current_user.id}} THEN amount
    ELSE taker_amount
  END
)
FROM single_bets
WHERE status = 'accepted' AND (maker_id = {{@current_user.id}} OR taker_id = {{user.id}});
© www.soinside.com 2019 - 2024. All rights reserved.