4

什麼性能差異,如果有的話,以下兩個選項(mentioned in this answer.exists之間的性能差異?和.where.present?

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) 

ID由數據庫索引。如果我選擇一個沒有編入索引的列,結果如下所示:

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

該表格大約有30000條記錄。那麼禮物?是否比存在?,因爲它必須先計算所有匹配的記錄。

相關問題