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...)
コメント