joins, eager_load, preload

絞り込みあり、joinしたテーブルの情報を使わない

f:id:tsuzuki670:20190704225553p:plain 絞り込みするのでpreloadはつかえない。

  • 処理時間

    • joinsで連結先テーブルの情報を含まない小さめのオブジェクトを扱う
    • eager_loadでは連結先テーブルの情報を含む大きめのオブジェクトを扱う
    • => joinsの方が処理時間が短い
  • メモリ使用量

    • joinsで連結先テーブルの情報を含まない小さめのオブジェクトを扱う
    • eager_loadでは連結先テーブルの情報を含む大きめのオブジェクトを扱う
    • => joinsの方がメモリ使用量が少ない

結論:「絞り込みあり、joinしたテーブルの情報を使わない」場合はjoinsがよい!

絞り込みなし、joinしたテーブルの情報を使う

f:id:tsuzuki670:20190704225918p:plain

  • 処理時間

    • joinsではN+1回のSQLで連結先テーブルの情報をとってくる
    • eager_loadでは1回のSQLで連結先テーブルの情報をとってくる
    • preloadでは2回のSQLで連結先テーブルの情報をとってくる
    • => joinsは処理時間が長く、eager_loadとpreloadは処理時間が同じくらい
  • メモリ使用量

    • => なぜか分からないがメモリ使用量はpreload < joins < eager_loadの順となる

結論:「絞り込みなし、joinしたテーブルの情報を使う」場合はpreloadがよい!

絞り込みあり、joinしたテーブルの情報を使う

f:id:tsuzuki670:20190704230315p:plain 絞り込みするので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がよい!