идентификаторы против карты против перебора в Rails

#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.