RailsのN+1問題をBulletで検出する

スポンサーリンク
スポンサーリンク
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました

Rails で N+1問題を検出するには gem の bullet を使うと便利です。bullet は、N+1問題の検出以外にも、不要な使われていない Eager Loading の検出なども行ってくれます。

Bullet

Bullet をインストールして使うと、N+1 問題や不要な Eager Loading を発見しやすくなります。

— 環境 —
Rails 4.1.1
Ruby 2.1.2

スポンサーリンク

N + 1 問題とは

N+1 問題は、has_many アソシエーション関係のあるコレクションを、テンプレートでループして出力させる場合などに起こりやすい。

本来 ActiveRecord でいう includes(SQL の JOIN)等を正しく使えば1〜2回で済む SQL クエリ発行が、N+1 回の SQL クエリを発行してしまう問題です。私も時々ミスってやってしまいます…。

また、ActiveRecord などデータベースへのアクセスを抽象化する OR マッパーのライブラリを使っている場合に、N + 1 問題が発生しやすい。OR マッパーは便利とはいえ、効率の良い SQL クエリを実行するには、OR マッパーの命令がどんな SQL 文を発行するのか知っておく必要がありますね。

もっと詳しく N+1 問題や Eager Loading について知りたい場合は、以下のページが分かりやすいです。

N+1問題 / Eager Loading とは – Rails Webook

Bullet インストール

では、本題へ。Bullet のインストール手順です。gem なので簡単。Gemfile に bullet を追記して、bundler でインストールします。

Gemfile

インストール。

Bullet の設定

Bullet をインストールし終わったら、config/environments/development.rb に設定を行う。

config/environments/development.rb

各々の設定の意味は、README によると以下のとおりです。

Bullet.enable: enable Bullet gem, otherwise do nothing
Bullet を有効にする、これを true にしないと Bullet を何もしない。

Bullet.bullet_logger: log to the Bullet log file (Rails.root/log/bullet.log)
Rails.root/log/bullet.log にログを記録する。

Bullet.console: log warnings to your browser’s console.log (Safari/Webkit browsers or Firefox w/Firebug installed)
ブラウザのコンソールに warnings のログを出力する。

Bullet.add_footer: adds the details in the bottom left corner of the page
ページのフッター左に詳細を表示する。

その他にも設定項目が多数用意されています。SlackAirbrake などに通知する設定もできるので、他の設定項目についての詳細は README を参考。

Bullet を使ってN+1問題を修正

例として User has_many Brushups というアソシエーションの関係のモデルがあったとして、以下のようなコードを書くと N + 1 問題が発生してしまいます。

app/controllers/home_controller.rb

app/views/home/index.html.erb

このアクションの URL にアクセスしたところ、ページのフッター部に “N+1 Query detected” の警告が表示されました。

Screen Shot 2016-01-14 at 12.01.28

Bullet がN+1問題を検出してくれましたので、コントローラーのコードを以下のように includes を使って修正します。

app/controllers/home_controller.rb

これで Bullet によるフッター部の警告表示が消えまして、N + 1 問題を解消できました。Bullet 便利です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!