首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果需要进一步过滤,查询中的'or‘对于活动记录查找是否更快?

如果需要进一步过滤,查询中的'or‘对于活动记录查找是否更快?
EN

Stack Overflow用户
提问于 2019-10-09 22:07:06
回答 1查看 21关注 0票数 1

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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‘子句不会发送到DB?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 05:45:02

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

2)将relation.pluck(:amount).sum修改为relation.sum(:amount)。它会快得多。

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

结果SQL将如下所示:

代码语言:javascript
复制
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}});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58306045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档