4

Какие показатели различия, если таковые существуют между следующими двумя вариантами (mentioned in this answer)Различия между .exists? и где.

Thing.where(name: "Bob").present? 

который производит SQL

SELECT COUNT(*) FROM things WHERE things.name = "Bob"; 

и

Thing.exists?(name: "Bob") 

, который производит SQL

SELECT 1 AS one from things WHERE name ="Bob" limit 1; 

Поскольку инструкции SQL различны, теоретически возможно, чтобы различия в производительности существовали. Но я не знаю, будет ли индексироваться name в базе данных, есть какая-то практическая разница. Кроме того, существует ли какая-либо разница в отношении объема работы, выполняемой на Ruby-land (например, инициализация и GC).

Если это имеет значение, я использую Rails 3.2.20.

ответ

6

Вы можете сделать тест самостоятельно, как это:

$ bin/rails c 
> ids = Item::Project.pluck(:id) 
> b = Benchmark.bmbm do |x| 
> x.report("present?") { 10000.times { Item::Project.where(id: ids.sample).present? } } 
> x.report("exist?") { 10000.times { Item::Project.exists?(id: ids.sample) } } 
> end 
> puts b 
    4.650000 0.270000 4.920000 ( 7.627897) 
    4.660000 0.330000 4.990000 ( 7.337031) 

идентификатор индексируется базы данных. Если я выберу колонку, которая не проиндексирована, результат будет выглядеть так:

12.590000 0.740000 13.330000 (71.199677) 
    8.350000 0.620000 8.970000 (34.846301) 

Для этой таблицы имеется около 30000 записей. Итак, настоящее время? медленнее, чем есть?, потому что он должен сначала подсчитать все согласованные записи.

Смежные вопросы