このようなカスタムクエリがあります
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 から得られた結果と比較して、(ほとんどが同意するだろう) 時間がかかる可能性があると想定しました。
しかし、驚くべきことに
上記の 2 つを実行すると、ロード時間に関して ActiveRecord カスタム クエリが ActiveRecord "find_by_sql" からリードしていることがわかりました。テスト結果は次のとおりです。
ActiveRecord カスタム クエリの読み込み時間
ウェブサイトの読み込み (0.9ms)
Web サイトの列 (1.0ms)
find_by_sql ロード時間
ウェブサイトの読み込み (1.3ms)
Web サイトの列 (1.0ms)
テストをもう一度繰り返しましたが、結果は同じでした(カスタムクエリが戦いに勝った)
違いはそれほど大きくないことはわかっていますが、通常のfind_by_sqlクエリがカスタムクエリよりも遅い理由を理解できません
誰でもこれについて光を共有できますか.
とにかくありがとう
よろしく ヴィレン・ネギ