2

我对我的rails应用程序中MySQL查询的执行时间有个疑问。使用find_by_sql和我们正常的rails查询方法有什么区别?

我已经写了像

@claims = Claim.joins('left join drugs on claims.ndc = drugs.ndcupchri left join pharmacies on claims.nabp = pharmacies.nabp').select('claims.*, drugs.*, pharmacies.* ').where('claims.member_id = '218').group(:ndc) 

查询和我使用的find_by_sql

@sql = "SELECT claims.*, drugs.*, pharmacies.* FROM `claims` 
      left join drugs on claims.ndc = drugs.ndcupchri 
      left join pharmacies on claims.nabp = pharmacies.nabp 
      WHERE (claims.member_id = '218') GROUP BY ndc " 

    @claims = Claim.find_by_sql(@sql) 

有时候,我看到使用的find_by_sql查询的执行时间是相当快时相比,写了相同的查询到另一个。它是否正确。

当涉及到面向性能时,上述哪种模式是更好的接受方法。请分享你的想法。

当前正在使用Rails 3.0.7

回答

2

第一个查询使用的是Arel。它提供了可链接性和范围。 所以,你如果要过滤你可以这样做更多的数据:

@claims.where(:id => 5) 

上面的事情是不可能的find_by_sql。另外,Arel会对使用Arel方法形成的SQL查询进行优化。你可以在谷歌上搜索Arel的其他优势。在rails 3.1中会有数据库查询结果的缓存(如果我错了,请纠正我)

如果你在sql方面非常好,那么find_by_sql将永远更优化,因为它直接在数据库上执行查询。但是,我们总是希望在生产力和表现上保持平衡。

0

在您的案例中,联接子句过多,因为您不在联接表上强加任何WHERE条件,仅在声明表上,并且在调用Claim.find_by_sql时,将仅填充声明对象。所以你的查询归结为

Claim.where(:member_id => 218) 

它会比两个查询都快,因为没有联接被执行。

通常只有一些特定的查询应该通过find_by_sql完成。 Rails的Arel接口足够灵活,可以实现大多数常用的查询,而且调试这些庞大的SQL语句要容易得多。

相关问题