Ruby on rails ActiveRecord自定义查询与通过sql加载查找

Ruby on rails ActiveRecord自定义查询与通过sql加载查找,ruby-on-rails,activerecord,load-time,find-by-sql,Ruby On Rails,Activerecord,Load Time,Find By Sql,我有一个自定义查询,如下所示 self.account.websites.find(:all,:joins => [:group_websites => {:group => :users}],:conditions=>["users.id =?",self]) 其中self是用户对象 我设法为相同的对象生成等效的SQL 这是它的样子 sql = "select * from websites INNER JOIN group_websites on group_web

我有一个自定义查询,如下所示

self.account.websites.find(:all,:joins => [:group_websites => {:group => :users}],:conditions=>["users.id =?",self])
其中self是用户对象

我设法为相同的对象生成等效的SQL

这是它的样子

sql = "select * from websites INNER JOIN group_websites on group_websites.website_id = websites.id INNER JOIN groups on groups.id = group_websites.group_id INNER JOIN group_users ON (groups.id = group_users.group_id) INNER JOIN users on (users.id = group_users.user_id) where (websites.account_id = #{account_id} AND (users.id = #{user_id}))"
通过对SQL和ActiveRecord的深入了解,我认为(大多数人都同意)从上述查询中获得的结果可能比从find_by_SQL(SQL)one中获得的结果需要更长的时间

但令人惊讶的是

当我运行上述两个 我发现ActiveRecord自定义查询在加载时间方面领先于ActiveRecord“find_by_sql” 这是测试结果

ActiveRecord自定义查询加载时间

网站负载(0.9ms)

网站栏目(1.0ms)

按sql加载时间查找

网站负载(1.3ms)

网站栏目(1.0ms)

我重复了一次又一次的测试,结果仍然是一样的(定制查询获胜)

我知道差异并没有那么大,但我还是不明白为什么一个普通的查询比自定义查询慢

有人能分享一下这方面的信息吗

无论如何谢谢你

问候
Viren Negi

原因可能很简单-对于自定义SQL,SQL查询会立即发送到db server执行。
请记住,Ruby是一种解释语言,因此Rails会根据您在将其发送到实际db服务器执行之前使用的ORM元语言生成一个新的SQL查询。我想说,额外的0.1毫秒是框架生成查询所花费的时间。

对于find case,查询是参数化的;这意味着数据库可以缓存查询计划,不需要再次解析和编译查询

在find_by_sql情况下,整个查询作为字符串传递给数据库。这意味着数据库不能对查询结构进行缓存,每次都需要对其进行解析和编译

我认为您可以对此进行测试:尝试以这种方式(参数化)通过sql查找:


两种方法生成的查询是否相同?如果不是的话,你能复制并粘贴两者吗?我认为是db缓存,而不是框架缓存造成了差异(根据我的回答)。RoR是否缓存查询结构?找到代码的链接了吗?
User.find_by_sql(["select * from websites INNER JOIN group_websites on group_websites.website_id = websites.id INNER JOIN groups on groups.id = group_websites.group_id INNER JOIN group_users ON (groups.id = group_users.group_id) INNER JOIN users on (users.id = group_users.user_id) where (websites.account_id = ? AND (users.id = ?))", account_id, users.id])