Railsを使ったWEBサービスでのSQL取得回数
Rails(フレームワーク問わず)での、一般的なSQL処理回数について質問です。
処理回数というのは、例えばユーザがルートページとする「ダッシュボード」というページがあるとします。
そのページを処理するとき、ユーザ情報等をDBより取得します。
そのSQL発行回数を抑えるように設計するのは当然ですが、皆さんの考え方として、「しきい値となる回数」
はどの程度でしょうか?(このactionでは5回もSQLを取得しているから多すぎる、設計を見直そう。など)
その点で具体的にお聞きしたいこともあります。
以下のテーブルがあるとします
users
(User has_one :setting
)user_settings
(User::Setting belongs_to :user
)
Deviseなどのgemを使えば、current_user
ヘルパーでユーザ情報を取得できますが、
user_settings
情報も同時に取得したい場合、
@user_setting = current_user.setting
とすると思います。
しかし同時にsettingの情報も取得したいので、
@current_user ||= User.includes(:setting).references(:setting).find(user_id)
という風に書けば、SQL発行は1回で済むと思います。
しかし、eager_load, preload, キャッシュなどの情報があり、ベストプラクティスとしてはどのような考え方なのかがわかりません。
例えば、current_user.setting
で取得して、current_user
と@user_setting
を2回のSQLで取得するのと、referencesを使ってjoinして取得するのとでは、SQLコストは同一として問題ないとして、
Rails内のメモリ管理(キャッシュ)の機構で影響がないのか?などです。
また、current_user
ヘルパーが
def current_user
@current_user ||= User.find(id) #idは何かしらで取得
end
となっていた場合、
知識がなく確信がないのですが、||=
としておくと一度のアクセスでcurrent_user
は1度のSQL処理しかしないという記述がありました(Railsチュートリアル)。
しかし、includes
とreferences
を利用するとcurrent_user
ヘルパーでcurrent_user
を呼び出すたびにSQLが呼び出されているログが確認できました(ログがUser Load
ではなくSQL (4.3ms)
となっているのはそういうことですよね?)。
includes
, references
を使わずに、個別に取得したほうがよいのでしょうか?