Производительность SQL-запроса для оператора «map» - PullRequest
1 голос
/ 08 марта 2011

Я использую Ruby on Rails 3, и я хотел бы знать, какова разница в производительности для этих операторов запроса:

# Case 1
accounts = ids.map { |id| Account.find_by_id(id) }

# Case 2
accounts = ids.map { |id| Account.where(:id => id).first }

Есть еще один способ улучшить ситуацию? Если ids равны 100 , , как я могу ограничить поиск до 5?

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Как сказал @RubyFanatic, между этими двумя нет реальной разницы (они оба сгенерируют один и тот же запрос), но есть значительно лучший способ сделать это:

accounts = Account.where(:id => ids)

Это будет генерировать sql как select * from accounts where accounts.id in (1,2,3) и будет значительно быстрее, чем находить их по одному.

И если вы хотите использовать только 5 идентификаторов из массива идентификаторов, вам нужно решить, какие 5 использовать. Например, если вы хотите использовать первые 5;

accounts = Account.where(:id => ids[0..4])

Или, вы могли бы использовать limit, но это заставляет запрос выполнять немного больше работы, если массив ids велик:

accounts = Account.where(:id => ids).limit(5)
1 голос
/ 08 марта 2011

Не должно быть разницы в производительности для этих двух запросов.Они буквально делают то же самое.Второе утверждение может быть немного медленнее, но оно настолько незначительно, что даже не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...