Posted at

N+1問題について

More than 3 years have passed since last update.


概要


SQLクエリが 「データ量N + 1回 」走ってしまい、取得するデータが多くなるにつれて(Nが増えるにつれて)パフォーマンスを低下させてしまう問題。

=> 低下させないようなコードを書くべき




具体例

@posts = Post.all 

@posts.each do |post|
post.user.name

などのコードを書くと、、、

起きること

userモデルを事前にローディングしていないので、post.userのたびにクエリが発行される

=> N+1問題



解決法

Eager Loading(事前にデータをローディングしておく)

メソッド includes を利用することで、Postモデルの取得時に、それに関連するUserモデルも取得できる。

@posts = Post.all.includes(:user)




参考「N+1 問題」を検出してくれるライブラリとしてbullet がある




参照

http://ruby-rails.hatenadiary.com/entry/20141108/1415418367

http://www.techscore.com/blog/2012/12/25/rails%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%B4%B9%E4%BB%8B-n1%E5%95%8F%E9%A1%8C%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E3%80%8Cbullet%E3%80%8D/