k-tokitoh

joins, eager_load, preload

2019-07-04

3 つのメソッドを比較する。

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

![f:id:tsuzuki670:20190704225553p:plain](https://cdn-ak.f.st- hatena.com/images/fotolife/t/tsuzuki670/20190704/20190704225553.png) 絞り込みするので preload はつかえない。

  • 処理時間

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

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

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

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

![f:id:tsuzuki670:20190704225918p:plain](https://cdn-ak.f.st- hatena.com/images/fotolife/t/tsuzuki670/20190704/20190704225918.png)

  • 処理時間

    • 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](https://cdn-ak.f.st- hatena.com/images/fotolife/t/tsuzuki670/20190704/20190704230315.png) 絞り込みするので 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 がよい!