哪个ActiveRecord查询更快?

时间:2015-02-04 20:47:20

标签: sql ruby-on-rails ruby activerecord

这三个查询返回相同的结果。我怎样才能找出哪一个更快?

IssueStatus.where 'issue_statuses.name != ?', IssueStatus::CLOSED

IssueStatus.where({name: ["Open", "Ice Box", "Submitted for merge", "In Progress"]})

IssueStatus.where.not(name: "Closed")

1 个答案:

答案 0 :(得分:3)

没有一个答案:这取决于您是否在该字段上有索引以及记录数。您可以在查询末尾附加.explain以获取Query Plan for the query的结果。

puts IssueStatus.where.not(name: "Closed").explain

这将有助于您在数据库级别了解哪一个更快。从数据库POV,第一个和第三个查询实际上是相同的。

第三个链接另外一个方法调用,因此它涉及Ruby级别的一些额外的对象分配(没有提到"Closed"导致创建新字符串,而使用IssueStatus::CLOSED则没有)。 / p>

乍一看,我可能会建议使用第一个版本。但正如我所说,查询计划将为您提供有关查询执行的更多详细信息。