ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?

我试图从我的文章模型中获取所有ID。 我可以用两种方式做到:

Article.select(:id).collect{|a| a.id} Article Load (2.6ms) SELECT "articles"."id" FROM "articles" 

要么

 2.2.1 :006 > Article.pluck(:id) (4.3ms) SELECT "articles"."id" FROM "articles" 

是什么赋予了? 为什么AR比Ruby版本慢?

即使我对Ruby方法进行基准测试,它似乎更快:

 Benchmark.measure{Article.select(:id).collect{|a| a.id}} Article Load (1.9ms) SELECT "articles"."id" FROM "articles" => # 

您的基准测试不准确。 首先,正如您所看到的,数据库端的两个执行都会触发相同的查询

 SELECT "articles"."id" FROM "articles" 

因此,数据库时间应该被视为无关紧要。 显然,这两个查询具有不同的执行时间,如控制台所示,但这是正常的,就好像您运行相同的查询100次执行时间每次都可能不同,因为它取决于各种变量,如机器负载,数据库状态等

由于数据库执行时间可以被认为是等效的,因此它与基准测试无关。

因此,您需要比较的是Ruby执行时间和分配。 与collect它不分配ActiveRecord对象相比,Pluck应该更快,更轻量,而只返回选定的值。

如果你真的想要对这些方法进行基准测试,你应该模拟数据库时间(这显然是可变的,但与此基准测试无关),只有基准分配和两种不同的Ruby方法。

长话短说, pluck通常更有效率。

select用于获取具有特定属性的记录。 它返回一个ActiveRecord::Relation对象。

pluck可以与select使用相同的方式使用,但是它返回一个选定属性的数组。

你可以阅读这篇文章 。