我试图对此查询进行基准测试:
Person.where(age: 60)
当我在控制台中运行时,它说:
人员负载(1.2ms)SELECT" people"。* FROM" people"在哪里"人们"。"年龄" =? [[" age",60]]
当我对它进行基准测试时,它会报告0.17ms
def self.get_ages_sql
sixties = Person.where(age: 60)
end
Benchmark.bmbm do |x|
x.report('sql') {Person.get_ages_sql}
end
之间的差异是什么: 0.17ms (基准) VS 1.2ms (在控制台中运行命令时报告)
答案 0 :(得分:2)
此代码实际上不执行数据库请求:
Person.where(age: 60)
它只是构建ActiveRecord::Relation
。
您可以通过在控制台中逐行执行下一个代码来确保并观察实际产生DB请求的行:
relation = Person.where(age: 60); 1
relation.class.name
relation.to_a
但是控制台会误导你“人员加载......”,因为它会在每个代码行结果上调用#inspect
之类的其他方法。这个额外的方法会导致DB请求:
relation = Person.where(age: 60).inspect; 1
这就是为什么你的基准测试错误 - 你测试查询创建而不是整个数据库请求。它应该看起来像:
def self.get_ages_sql
Person.where(age: 60).to_a
end
已添加:要深入了解控制台,请创建
class ConsoleTest
def inspect
data.inspect
end
def data
'Doing DB request'
end
def self.test_data
ct = self.new
puts 'No request yet'
ct.data
end
end
然后在Console中尝试:
ct = ConsoleTest.new
和
ct = ConsoleTest.new; 1
ct.data
和
ConsoleTest.test_data