#ruby-on-rails #activerecord
#ruby-on-rails #activerecord
Вопрос:
Benchmark.bm do |x|
x.report { ta_query.all.map{ |ta| ta.id } }
x.report { ta_query.pluck(:id) }
x.report { ta_query.ids }
end
Я протестировал это, и ids является самым быстрым, но я не могу найти ни одного ресурса, говорящего, что лучше использовать ids, чем pluck, все статьи, похоже, обсуждают pluck вместо select: / Есть идеи, почему ids быстрее?
Комментарии:
1.Ваш тест неверен:
#ids
такой же, какpluck(:id)
github.com/rails/rails/blob/master/activerecord/lib /…2. Но все они являются неправильным ответом в 99% случаев. Вместо этого просто передайте отношение, чтобы его можно было использовать для создания подзапроса вместо создания двух запросов.
3.
.ids
и.pluck(:id)
оба выполняют один и тот же запрос. Скорее всего, в вашей базе данных уже есть результаты запроса, и именно поэтому вы получили «более быстрый» ответ в.ids
тесте; однако в производственных системах это будет то же самое.4. Во-вторых, @max лучше всего использовать
select(:id)
, передавая все отношение условному WHERE, которое вызовет это преобразование, я предпочитаю избегать «rails magic», где это возможно, чтобы обеспечить ясность кода. Если вам действительно нужен повторяющийся список идентификаторов, было бы рекомендуетсяselect(:id).each
избегать загрузки всех идентификаторов одновременно5. И используйте
A.connection.clear_query_cache
между bechmarks, чтобы устранить проблему с кэшированием, отмеченную @RocKhalil.