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を使わずに、個別に取得したほうがよいのでしょうか?