[Rails Best Practice]Active Record Query Interface Optimization[訳]

Rails Best Practice

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...)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

コメント

タイトルとURLをコピーしました