https://rails-bestpractices.com/posts/2011/06/23/active-record-query-interface-optimization/
偉大な本家様
自分の勉強用に Rails Best Practiceシリーズを翻訳します。
Before
アクティブレコードのアソシエーションで select パラメータを使用すると、約50%以上の高速化が可能です。以下の例はselectを使用したアソシエーションの最適化にのみ焦点を当てているので、さらに最適化があります。
2つのモデル:
class Patient < ActiveRecord::Base
  belongs_to :physician
end
class Physician < ActiveRecord::Base
  has_many :patients
end
リファクタリング後:
class Patient < ActiveRecord::Base
  belongs_to :physician, :select => 'id,name, surname'
end
class Physician < ActiveRecord::Base
  has_many :patients, :select => 'id,name, physician_id'
end
私は検査のために2000レコードのPatientテーブルと4000レコードのPhysicianテーブルを使用しました。次のようなクエリを与えた。
@physicians = Physician.includes(:patients).all
生成されたSqlは
リファクタリング前
Physician Load (33.9ms)  SELECT `physicians`.* FROM `physicians`
Patient Load (66.5ms)  SELECT `patients`.* FROM `patients` WHERE `patients`.`physician_id` IN (1, 2, 3,...)
リファクタリング後
Physician Load (31.8ms)  SELECT `physicians`.* FROM `physicians`
Patient Load (22.3ms)  SELECT name,physician_id,id FROM `patients` WHERE `patients`.`physician_id` IN (1, 2, 3,...)
明らかに、クエリの関連付けを belongs_to でリファクタリングすることができます。
@patients = Patient.includes(:physician).all
リファクタリング前
SELECT `patients`.* FROM `patients`
Physician Load (32.5ms)  SELECT `physicians`.* FROM `physicians` WHERE `physicians`.`id` IN (1, 1799, 1562, 611, 1287...)
リファクタリング後
SELECT `patients`.* FROM `patients`
Physician Load (10.1ms)   SELECT id,name,surname FROM `physicians` WHERE `physicians`.`id` IN (1, 1799, 1562, 611, 1287...)
      
  
  
  
  
コメント