2019-07-04
joins, eager_load, preload
3 つのメソッドを比較する。
絞り込みあり、join したテーブルの情報を使わない
 絞り込みするので preload はつかえない。
処理時間
- joins で連結先テーブルの情報を含まない小さめのオブジェクトを扱う
- eager_load では連結先テーブルの情報を含む大きめのオブジェクトを扱う
- => joins の方が処理時間が短い
メモリ使用量
- joins で連結先テーブルの情報を含まない小さめのオブジェクトを扱う
- eager_load では連結先テーブルの情報を含む大きめのオブジェクトを扱う
- => joins の方がメモリ使用量が少ない
結論:「絞り込みあり、join したテーブルの情報を使わない」場合は joins がよい!
絞り込みなし、join したテーブルの情報を使う

処理時間
- joins では N+1 回の SQL で連結先テーブルの情報をとってくる
- eager_load では 1 回の SQL で連結先テーブルの情報をとってくる
- preload では 2 回の SQL で連結先テーブルの情報をとってくる
- => joins は処理時間が長く、eager_load と preload は処理時間が同じくらい
メモリ使用量
- => なぜか分からないがメモリ使用量は
preload < joins < eager_load
の順となる
- => なぜか分からないがメモリ使用量は
結論:「絞り込みなし、join したテーブルの情報を使う」場合は preload がよい!
絞り込みあり、join したテーブルの情報を使う
 絞り込みするので preload はつかえない。
処理時間
- joins では N+1 回の SQL で連結先テーブルの情報をとってくる
- eager_load では 1 回の SQL で連結先テーブルの情報をとってくる
- => eager_load の方が処理時間が短い
メモリ使用量
- joins では N+1 回の SQL の結果、連結先テーブルの情報をロードする
- eager_load では 1 回の SQL の結果、連結先テーブルの情報をロードする
- => joins も eager_load もメモリ使用量は同じくらい
結論:「絞り込みあり、join したテーブルの情報を使う」場合は eager_load がよい!