Upgrade to Pro — share decks privately, control downloads, hide ads and more …

そろそろ理解する includes / Understanding includes

Shintani Teppei
May 10, 2024
830

そろそろ理解する includes / Understanding includes

RubyKaigi 2024 直前LT祭の発表スライドです。
https://timeedev.connpass.com/event/315946/

スライド内の includes クイズを手元で動かすためのスクリプト:
https://gist.github.com/euglena1215/fb6cd1235278491dc206b9bd6feaf71e

Shintani Teppei

May 10, 2024
Tweet

More Decks by Shintani Teppei

Transcript

  1. 1. includes 先に references を使っている → eager_load 2. includes 先に

    joins を使っている → eager_load 3. それ以外 → preload 判定ルール joins も同じ挙動
  2. 1. includes 先に references を使っている → eager_load 2. includes 先に

    joins を使っている → eager_load 3. それ以外 → preload 判定ルール
  3. 1. includes 先に references を使っている → eager_load 2. includes 先に

    joins を使っている → eager_load 3. includes 先で絞り込みを Hash 形式で行っている → eager_load 4. それ以外 → preload 判定ルール
  4. includes クイズ④ Q. どんなクエリが発行されるでしょうか? A. author も eager_load 相当の LEFT

    OUTER JOIN で結合される preload と同様 author(user) は クエリが分割されるものだと思ってました 😇
  5. 1. includes 先に references を使っている → eager_load 2. includes 先に

    joins を使っている → eager_load 3. includes 先で絞り込みを Hash 形式で行っている → eager_load 4. それ以外 → preload 判定ルール
  6. 1. includes 先に references を使っている → eager_load 2. includes 先に

    joins を使っている → eager_load 3. includes 先で絞り込みを Hash 形式で1つ以上行っている → 全部 eager_load 4. それ以外 → preload 判定ルール
  7. 1. includes 先に references を1つ以上使っている → 全部 eager_load 2. includes

    先に joins を1つ以上使っている → 全部 eager_load 3. includes 先で絞り込みを Hash 形式で1つ以上行っている → 全部 eager_load 4. それ以外 → preload 判定ルール references, joins も同様の挙動
  8. 1. includes 先に references を1つ以上使っている → 全部 eager_load 2. includes

    先に joins を1つ以上使っている → 全部 eager_load 3. includes 先で絞り込みを Hash 形式で1つ以上行っている → 全部 eager_load 4. それ以外 → preload 判定ルール
  9. 1. includes 先に references を1つ以上使っている → 全部 eager_load 2. includes

    先に joins を1つ以上使っている → 全部 eager_load 3. includes 先で絞り込みを Hash 形式で1つ以上行っている → 全部 eager_load 4. eager_load を併用している → 全部 eager_load 5. それ以外 → preload 判定ルール
  10. 1. includes 先に references を1つ以上使っている → 全部 eager_load 2. includes

    先に joins を1つ以上使っている → 全部 eager_load 3. includes 先で絞り込みを Hash 形式で1つ以上行っている → 全部 eager_load 4. eager_load を併用している → 全部 eager_load 5. それ以外 → preload 判定ルール 完成 🎉🎉🎉 したはず...間違いあればこっそり教えてください
  11. 1. includes 先に references を1つ以上使っている → 全部 eager_load 2. includes

    先に joins を1つ以上使っている → 全部 eager_load 3. include先で絞り込みを Hash形式で1つ以上行っている → 全部 eager_load 4. eager_load を併用している → 全部 eager_load 5. それ以外 → preload 判定ルール 完成 🎉🎉🎉 したはず...間違いあればこっそり教えてください このルール結構厳しくない?🤔
  12. • いずれかのルールによって突然全てが eager_load 相当として扱われ、 1つのクエリになるのは大変厳しい • パフォーマンス上の意図がなければ基本的には preload を使い、同時に絞り 込みを行いたいときだけ

    eager_load を使う方が無難そう • includes が部分的に preload 相当の挙動をしてくれるといいな... 🥺 自分の考え みなさんのincludesへの向き合い方を ぜひXで教えてください! #RubyKaigi2024_直前LT祭