Является ли «или» в запросе быстрее для поиска в Active Record, если вам нужно дополнительно отфильтровать его? - PullRequest
1 голос
/ 09 октября 2019

Какой запрос быстрее? В первом примере я делаю 2 вызова в БД.

Во втором примере я делаю 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

против

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

Выобратите внимание, что во втором примере мне нужно использовать предложение where при расчете @total. Я думаю, что этот второй пример быстрее, потому что предложение 'where' не собирается в БД?

Спасибо!

1 Ответ

1 голос
/ 10 октября 2019

1) Вы делаете 2 запроса к БД в обоих случаях, только второй подход уродлив и не имеет никакого смысла. Вы должны проверить в консоли, какие запросы SQL отправляются, и понять, что происходит.

2) Измените relation.pluck(:amount).sum на relation.sum(:amount). Это будет намного быстрее.

3) Первый подход выглядит хорошо, однако вы можете выполнить это вычисление с помощью вызова из 1 БД, но для этого потребуется написание некоторого необработанного 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}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...