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語句要容易得多。

相關問題